From db21010fe42fd36d8e7c02dddceb234c5709906f Mon Sep 17 00:00:00 2001 From: Kwazygloo <85138054+Kwazygloo@users.noreply.github.com> Date: Thu, 3 Jun 2021 08:40:25 -0400 Subject: [PATCH 01/32] Update FactionInfo.ts --- src/Faction/FactionInfo.ts | 46 +++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/src/Faction/FactionInfo.ts b/src/Faction/FactionInfo.ts index b9944496c..4fb3ec705 100644 --- a/src/Faction/FactionInfo.ts +++ b/src/Faction/FactionInfo.ts @@ -74,7 +74,7 @@ export const FactionInfos: IMap = { // Endgame Illuminati: new FactionInfo( "Humanity never changes. No matter how civilized society becomes, it will eventually fall back into chaos. " + - "And from this chaos, we are the Invisible hand that guides them to order. ", + "And from this chaos, we are the invisible hand that guides them to order. ", [], true, true, @@ -112,7 +112,7 @@ export const FactionInfos: IMap = { true), MegaCorp: new FactionInfo( - "MegaCorp does things that others don't. We imagine. We create. We invent. We build things that others have " + + "MegaCorp does what no other dares to do. We imagine. We create. We invent. We create what others have " + "never even dreamed of. Our work fills the world's needs for food, water, power, and transporation on an " + "unprecendented scale, in ways that no other company can.
" + "
" + @@ -126,7 +126,7 @@ export const FactionInfos: IMap = { "Bachman & Associates": new FactionInfo( "Where Law and Business meet - thats where we are.
" + "
" + - "Legal Insight - Business Instinct - Experience Innovation", + "Legal Insight - Business Instinct - Innovative Experience.", [], true, true, @@ -134,7 +134,7 @@ export const FactionInfos: IMap = { true), "Blade Industries": new FactionInfo( - "Augmentation is salvation", + "Augmentation is Salvation.", [], true, true, @@ -142,8 +142,8 @@ export const FactionInfos: IMap = { true), NWO: new FactionInfo( - "The human being does not truly desire freedom. It wants to be observed, understood, and judged. It wants to " + - "be given purpose and direction in its life. That is why humans created God. And that is why humans created " + + "Humans don't truly desire freedom. They want to be observed, understood, and judged. They want to " + + "be given purpose and direction in life. That is why they created God. And that is why they created " + "civilization - not because of willingness, but because of a need to be incorporated into higher orders of " + "structure and meaning.", [], @@ -153,7 +153,7 @@ export const FactionInfos: IMap = { true), "Clarke Incorporated": new FactionInfo( - "Unlocking the power of the genome", + "The Power of the Genome - Unlocked.", [], true, true, @@ -161,7 +161,7 @@ export const FactionInfos: IMap = { true), "OmniTek Incorporated": new FactionInfo( - "Simply put, our mission is to design and build robots that make a difference", + "Simply put, our mission is to design and build robots that make a difference.", [], true, true, @@ -203,7 +203,7 @@ export const FactionInfos: IMap = { "leave behind their bits, mere traces of seemingly meaningless fragments of information. But these bits can be " + "reconstructed. Transformed. Used.
" + "
" + - "Those who run the bits, run the world", + "Those who run the bits, run the world.", [], true, true, @@ -266,7 +266,7 @@ export const FactionInfos: IMap = { // City factions, essentially governments Aevum: new FactionInfo( - "The Silicon City", + "The Silicon City.", [ "Chongqing", "New Tokyo", @@ -278,7 +278,7 @@ export const FactionInfos: IMap = { true, true), Chongqing: new FactionInfo( - "Serve the people", + "Serve the People.", [ "Sector-12", "Aevum", @@ -289,7 +289,7 @@ export const FactionInfos: IMap = { true, true), Ishima: new FactionInfo( - "The East Asian Order of the Future", + "The East Asian Order of the Future.", [ "Sector-12", "Aevum", @@ -300,7 +300,7 @@ export const FactionInfos: IMap = { true, true), "New Tokyo": new FactionInfo( - "Asia's World City", + "Asia's World City.", [ "Sector-12", "Aevum", @@ -311,7 +311,7 @@ export const FactionInfos: IMap = { true, true), "Sector-12": new FactionInfo( - "The City of the Future", + "The City of the Future.", [ "Chongqing", "New Tokyo", @@ -323,7 +323,7 @@ export const FactionInfos: IMap = { true, true), Volhaven: new FactionInfo( - "Benefit, Honour, and Glory", + "Benefit, Honor, and Glory.", [ "Chongqing", "Sector-12", @@ -338,7 +338,7 @@ export const FactionInfos: IMap = { // Criminal Organizations/Gangs "Speakers for the Dead": new FactionInfo( - "It is better to reign in hell than to serve in heaven.", + "It is better to reign in Hell than to serve in Heaven.", [], true, true, @@ -346,7 +346,7 @@ export const FactionInfos: IMap = { true), "The Dark Army": new FactionInfo( - "The World doesn't care about right or wrong. It's all about power.", + "The World doesn't care about right or wrong. It only cares about power.", [], true, true, @@ -354,7 +354,7 @@ export const FactionInfos: IMap = { false), "The Syndicate": new FactionInfo( - "Honor holds you back", + "Honor holds you back.", [], true, true, @@ -374,7 +374,7 @@ export const FactionInfos: IMap = { false), Tetrads: new FactionInfo( - "Following the Mandate of Heaven and Carrying out the Way", + "Following the mandate of Heaven and carrying out the way.", [], false, false, @@ -399,7 +399,7 @@ export const FactionInfos: IMap = { false), "Tian Di Hui": new FactionInfo( - "Obey Heaven and Work Righteousness", + "Obey Heaven and work righteously.", [], true, true, @@ -407,10 +407,10 @@ export const FactionInfos: IMap = { true), CyberSec: new FactionInfo( - "The Internet is the first thing that humanity has built that humanity doesn’t understand, the largest " + - "experiment in anarchy that we have ever had. And as the world becomes increasingly dominated by the internet, " + + "The Internet is the first thing that was built that we don't fully understand, the largest " + + "experiment in anarchy that we have ever had. And as the world becomes increasingly dominated by it, " + "society approaches the brink of total chaos. We serve only to protect society, to protect humanity, to " + - "protect the world from its imminent collapse.", + "protect the world from imminent collapse.", [], true, true, From 1ad0fbe2e1363dc84a453b320907a70566e1bf95 Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 11:03:20 -0400 Subject: [PATCH 02/32] Attempt #1 at creating custom augment --- src/Augmentation/AugmentationHelpers.jsx | 13 +++++++++++++ src/Augmentation/data/AugmentationNames.ts | 1 + 2 files changed, 14 insertions(+) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index b7df5ce26..417362c22 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -36,6 +36,19 @@ function initAugmentations() { //Reset Augmentations clearObject(Augmentations); + //Time-Based Augment Test + const CircadianRhythm = new Augmentation({ + name:AugmentationNames.CircadianRhythm, moneyCost: 0, repCost:0, + info:"An injection which improves your perception by a variable amount.

" + + "This augmentation increases the player's hacking skill by a variable amount.", + hacking_mult: 1.08, + }); + CircadianRhythm.addToFactions(["VitaLife"]); + if (augmentationExists(AugmentationNames.CircadianRhythm)) { + delete Augmentations[AugmentationNames.CircadianRhythm]; + } + AddToAugmentations(CircadianRhythm); + //Combat stat augmentations const HemoRecirculator = new Augmentation({ name:AugmentationNames.HemoRecirculator, moneyCost: 9e6, repCost:4e3, diff --git a/src/Augmentation/data/AugmentationNames.ts b/src/Augmentation/data/AugmentationNames.ts index 2c681008d..c889a8dfc 100644 --- a/src/Augmentation/data/AugmentationNames.ts +++ b/src/Augmentation/data/AugmentationNames.ts @@ -1,6 +1,7 @@ import { IMap } from "../../types"; export const AugmentationNames: IMap = { + CircadianRhythm: "Circadian Modulator", Targeting1: "Augmented Targeting I", Targeting2: "Augmented Targeting II", Targeting3: "Augmented Targeting III", From e0436a4314d5c90730c8e7513c9d0e63df6c3d28 Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 11:07:05 -0400 Subject: [PATCH 03/32] increased effect of modulator to test --- src/Augmentation/AugmentationHelpers.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index 417362c22..b8b1e5576 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -41,7 +41,7 @@ function initAugmentations() { name:AugmentationNames.CircadianRhythm, moneyCost: 0, repCost:0, info:"An injection which improves your perception by a variable amount.

" + "This augmentation increases the player's hacking skill by a variable amount.", - hacking_mult: 1.08, + hacking_mult: 111.08, }); CircadianRhythm.addToFactions(["VitaLife"]); if (augmentationExists(AugmentationNames.CircadianRhythm)) { From aef0cc815e2391bd68ea49c7840ec4509f5af403 Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 11:12:28 -0400 Subject: [PATCH 04/32] added rng to circ. modulator --- src/Augmentation/AugmentationHelpers.jsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index b8b1e5576..2c2b80cf5 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -18,6 +18,8 @@ import { dialogBoxCreate } from "../../utils/DialogBox"; import { clearObject } from "../../utils/helpers/clearObject"; import { Money } from "../ui/React/Money"; +import { WHRNG } from "../Casino/RNG"; + import React from "react"; import ReactDOM from "react-dom"; @@ -41,7 +43,7 @@ function initAugmentations() { name:AugmentationNames.CircadianRhythm, moneyCost: 0, repCost:0, info:"An injection which improves your perception by a variable amount.

" + "This augmentation increases the player's hacking skill by a variable amount.", - hacking_mult: 111.08, + hacking_mult: (1 + new WHRNG((new Date()).getMinutes() * 60 + (new Date()).getSeconds()).random()), }); CircadianRhythm.addToFactions(["VitaLife"]); if (augmentationExists(AugmentationNames.CircadianRhythm)) { From d86fb0262aafe0fd366567b70289b27b1e9b5d21 Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 11:29:55 -0400 Subject: [PATCH 05/32] Attempt 2 --- src/Augmentation/AugmentationHelpers.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index 2c2b80cf5..2c7cc57f1 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -43,7 +43,7 @@ function initAugmentations() { name:AugmentationNames.CircadianRhythm, moneyCost: 0, repCost:0, info:"An injection which improves your perception by a variable amount.

" + "This augmentation increases the player's hacking skill by a variable amount.", - hacking_mult: (1 + new WHRNG((new Date()).getMinutes() * 60 + (new Date()).getSeconds()).random()), + hacking_mult: (1 + new WHRNG(Player.lastUpdate)), }); CircadianRhythm.addToFactions(["VitaLife"]); if (augmentationExists(AugmentationNames.CircadianRhythm)) { From 23cefed8d444930c6af4f5825ecf83ac20b4a518 Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 11:31:28 -0400 Subject: [PATCH 06/32] test --- src/Augmentation/AugmentationHelpers.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index 2c7cc57f1..f2e398627 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -43,7 +43,7 @@ function initAugmentations() { name:AugmentationNames.CircadianRhythm, moneyCost: 0, repCost:0, info:"An injection which improves your perception by a variable amount.

" + "This augmentation increases the player's hacking skill by a variable amount.", - hacking_mult: (1 + new WHRNG(Player.lastUpdate)), + hacking_mult: (1 + new WHRNG(Player.lastUpdate).random()), }); CircadianRhythm.addToFactions(["VitaLife"]); if (augmentationExists(AugmentationNames.CircadianRhythm)) { From c47990ef566cf9429c47dee38c95387f1ddf6e51 Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 11:35:02 -0400 Subject: [PATCH 07/32] Fixed RNG generation for augment --- src/Augmentation/AugmentationHelpers.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index f2e398627..1cd245fd3 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -43,9 +43,9 @@ function initAugmentations() { name:AugmentationNames.CircadianRhythm, moneyCost: 0, repCost:0, info:"An injection which improves your perception by a variable amount.

" + "This augmentation increases the player's hacking skill by a variable amount.", - hacking_mult: (1 + new WHRNG(Player.lastUpdate).random()), + hacking_mult: (0.9 + 1.1 * (new WHRNG(Player.lastUpdate).random())), }); - CircadianRhythm.addToFactions(["VitaLife"]); + CircadianRhythm.addToFactions(["Illuminati"]); if (augmentationExists(AugmentationNames.CircadianRhythm)) { delete Augmentations[AugmentationNames.CircadianRhythm]; } From e7fde38bf968cc9431b409e90ba52c0f49eeca0c Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 11:55:01 -0400 Subject: [PATCH 08/32] testing step random --- src/Augmentation/AugmentationHelpers.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index 1cd245fd3..0a6cf4dbf 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -40,7 +40,7 @@ function initAugmentations() { //Time-Based Augment Test const CircadianRhythm = new Augmentation({ - name:AugmentationNames.CircadianRhythm, moneyCost: 0, repCost:0, + name:AugmentationNames.CircadianRhythm, moneyCost: 1e12, repCost:450e3, info:"An injection which improves your perception by a variable amount.

" + "This augmentation increases the player's hacking skill by a variable amount.", hacking_mult: (0.9 + 1.1 * (new WHRNG(Player.lastUpdate).random())), From 21611ec57108e96691d258a1c7fff00775a0838b Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 11:59:49 -0400 Subject: [PATCH 09/32] Made random mult into function --- src/Augmentation/AugmentationHelpers.jsx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index 0a6cf4dbf..26f4ebbd1 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -28,6 +28,12 @@ function AddToAugmentations(aug) { Augmentations[name] = aug; } +function getRandomMultiplier(min, max) { + var randomNumber = (new WHRNG(Player.lastUpdate)); + randomNumber.step(); + return (min + (max - min) * (randomNumber.random())); +} + function initAugmentations() { for (var name in Factions) { if (Factions.hasOwnProperty(name)) { @@ -43,7 +49,7 @@ function initAugmentations() { name:AugmentationNames.CircadianRhythm, moneyCost: 1e12, repCost:450e3, info:"An injection which improves your perception by a variable amount.

" + "This augmentation increases the player's hacking skill by a variable amount.", - hacking_mult: (0.9 + 1.1 * (new WHRNG(Player.lastUpdate).random())), + hacking_mult: getRandomMultiplier(0.9, 2), }); CircadianRhythm.addToFactions(["Illuminati"]); if (augmentationExists(AugmentationNames.CircadianRhythm)) { From 0ec05f3fe2317487e7cf8250dee7bd073e042af2 Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 12:10:26 -0400 Subject: [PATCH 10/32] get random modifier for augment function added --- src/Augmentation/AugmentationHelpers.jsx | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index 26f4ebbd1..ce978f9af 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -34,6 +34,20 @@ function getRandomMultiplier(min, max) { return (min + (max - min) * (randomNumber.random())); } +function getRandomModifier() { + var multiplierTypes = [ + "hacking_chance_mult", + "hacking_speed_mult", + "hacking_money_mult" + "hacking_grow_mult", + "hacking_mult", + "hacking_exp_mult"]; + + var randomNumber = (new WHRNG(Player.lastUpdate)); + randomNumber.step(); + return (multiplierTypes[Math.floor(multiplierTypes.length() * randomNumber.random())]); +} + function initAugmentations() { for (var name in Factions) { if (Factions.hasOwnProperty(name)) { @@ -49,7 +63,7 @@ function initAugmentations() { name:AugmentationNames.CircadianRhythm, moneyCost: 1e12, repCost:450e3, info:"An injection which improves your perception by a variable amount.

" + "This augmentation increases the player's hacking skill by a variable amount.", - hacking_mult: getRandomMultiplier(0.9, 2), + getRandomModifier(): getRandomMultiplier(0.9, 2), }); CircadianRhythm.addToFactions(["Illuminati"]); if (augmentationExists(AugmentationNames.CircadianRhythm)) { From e9eae408912a9e658444208bce00b76b164adef5 Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 12:21:56 -0400 Subject: [PATCH 11/32] expanded multiplierTypes --- src/Augmentation/AugmentationHelpers.jsx | 25 +++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index ce978f9af..f7a5bbff8 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -35,13 +35,28 @@ function getRandomMultiplier(min, max) { } function getRandomModifier() { - var multiplierTypes = [ - "hacking_chance_mult", + var multiplierTypes = ["hacking_chance_mult", "hacking_speed_mult", - "hacking_money_mult" + "hacking_money_mult", "hacking_grow_mult", "hacking_mult", - "hacking_exp_mult"]; + "strength_mult", + "defense_mult", + "dexterity_mult", + "agility_mult", + "charisma_mult", + "hacking_exp_mult", + "strength_exp_mult", + "defense_exp_mult", + "dexterity_exp_mult", + "agility_exp_mult", + "charisma_exp_mult", + "company_rep_mult", + "faction_rep_mult", + "crime_money_mult", + "crime_success_mult", + "hacknet_node_money_mult", + "work_money_mult"]; var randomNumber = (new WHRNG(Player.lastUpdate)); randomNumber.step(); @@ -63,7 +78,7 @@ function initAugmentations() { name:AugmentationNames.CircadianRhythm, moneyCost: 1e12, repCost:450e3, info:"An injection which improves your perception by a variable amount.

" + "This augmentation increases the player's hacking skill by a variable amount.", - getRandomModifier(): getRandomMultiplier(0.9, 2), + getRandomModifier(): getRandomMultiplier(0.85, 1.5), }); CircadianRhythm.addToFactions(["Illuminati"]); if (augmentationExists(AugmentationNames.CircadianRhythm)) { From b88990444b703d17a4a0940d0df3166e4c2a0a18 Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 12:25:35 -0400 Subject: [PATCH 12/32] Swapped faction to speakers for the dead, modified price + rep cost, modified lore --- src/Augmentation/AugmentationHelpers.jsx | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index f7a5bbff8..e7e36cfca 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -29,7 +29,7 @@ function AddToAugmentations(aug) { } function getRandomMultiplier(min, max) { - var randomNumber = (new WHRNG(Player.lastUpdate)); + let randomNumber = (new WHRNG(new Date().getHours())); randomNumber.step(); return (min + (max - min) * (randomNumber.random())); } @@ -55,12 +55,12 @@ function getRandomModifier() { "faction_rep_mult", "crime_money_mult", "crime_success_mult", - "hacknet_node_money_mult", "work_money_mult"]; - var randomNumber = (new WHRNG(Player.lastUpdate)); + let randomNumber = (new WHRNG(new Date().getHours())); + randomNumber.step(); - return (multiplierTypes[Math.floor(multiplierTypes.length() * randomNumber.random())]); + return (multiplierTypes[Math.floor(multiplierTypes.length * randomNumber.random())]); } function initAugmentations() { @@ -74,13 +74,16 @@ function initAugmentations() { clearObject(Augmentations); //Time-Based Augment Test + var randomMod = getRandomModifier(); + const CircadianRhythm = new Augmentation({ name:AugmentationNames.CircadianRhythm, moneyCost: 1e12, repCost:450e3, - info:"An injection which improves your perception by a variable amount.

" + - "This augmentation increases the player's hacking skill by a variable amount.", - getRandomModifier(): getRandomMultiplier(0.85, 1.5), + info:"An prototype injection which modifies your circadian rhythm, leading to unexpected effects.

" + + "This augmentation increases or decreases a random skill by a random amount depending on install time.
" + + "Debug:" + randomMod + " by " + getRandomMultiplier(0.85, 1.5) + " " + Math.floor(Player.lastUpdate/360000), + [randomMod]: getRandomMultiplier(0.85, 1.5), }); - CircadianRhythm.addToFactions(["Illuminati"]); + CircadianRhythm.addToFactions(["Speakers for the Dead"]); if (augmentationExists(AugmentationNames.CircadianRhythm)) { delete Augmentations[AugmentationNames.CircadianRhythm]; } From a3496cdfa9796021352c8f0e076f05c10f654532 Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 13:25:20 -0400 Subject: [PATCH 13/32] changed rng method to based on hour of install, changes every 360000 ms --- src/Augmentation/AugmentationHelpers.jsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index e7e36cfca..90f2954eb 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -29,7 +29,7 @@ function AddToAugmentations(aug) { } function getRandomMultiplier(min, max) { - let randomNumber = (new WHRNG(new Date().getHours())); + let randomNumber = (new WHRNG(Math.floor(Player.lastUpdate/360000))); randomNumber.step(); return (min + (max - min) * (randomNumber.random())); } @@ -57,7 +57,7 @@ function getRandomModifier() { "crime_success_mult", "work_money_mult"]; - let randomNumber = (new WHRNG(new Date().getHours())); + let randomNumber = (new WHRNG(Math.floor(Player.lastUpdate/360000))); randomNumber.step(); return (multiplierTypes[Math.floor(multiplierTypes.length * randomNumber.random())]); From 4ac91f5599c3b4726fb0b1787a5e579725e00e8f Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 15:27:08 -0400 Subject: [PATCH 14/32] set to hour instead of 6 mins --- src/Augmentation/AugmentationHelpers.jsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index 90f2954eb..c63b9f3a8 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -29,7 +29,7 @@ function AddToAugmentations(aug) { } function getRandomMultiplier(min, max) { - let randomNumber = (new WHRNG(Math.floor(Player.lastUpdate/360000))); + let randomNumber = (new WHRNG(Math.floor(Player.lastUpdate/3600000))); randomNumber.step(); return (min + (max - min) * (randomNumber.random())); } @@ -57,7 +57,7 @@ function getRandomModifier() { "crime_success_mult", "work_money_mult"]; - let randomNumber = (new WHRNG(Math.floor(Player.lastUpdate/360000))); + let randomNumber = (new WHRNG(Math.floor(Player.lastUpdate/3600000))); randomNumber.step(); return (multiplierTypes[Math.floor(multiplierTypes.length * randomNumber.random())]); @@ -80,7 +80,7 @@ function initAugmentations() { name:AugmentationNames.CircadianRhythm, moneyCost: 1e12, repCost:450e3, info:"An prototype injection which modifies your circadian rhythm, leading to unexpected effects.

" + "This augmentation increases or decreases a random skill by a random amount depending on install time.
" + - "Debug:" + randomMod + " by " + getRandomMultiplier(0.85, 1.5) + " " + Math.floor(Player.lastUpdate/360000), + "Debug:" + randomMod + " by " + getRandomMultiplier(0.85, 1.5) + " " + Math.floor(Player.lastUpdate/3600000), [randomMod]: getRandomMultiplier(0.85, 1.5), }); CircadianRhythm.addToFactions(["Speakers for the Dead"]); From 29d7134859317aeb57ab1e77eaa36b26cc8be0ef Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 15:41:19 -0400 Subject: [PATCH 15/32] testing --- src/Augmentation/AugmentationHelpers.jsx | 71 ++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 4 deletions(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index c63b9f3a8..bdced65ab 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -35,7 +35,8 @@ function getRandomMultiplier(min, max) { } function getRandomModifier() { - var multiplierTypes = ["hacking_chance_mult", + var multiplierTypes = + ["hacking_chance_mult", "hacking_speed_mult", "hacking_money_mult", "hacking_grow_mult", @@ -63,6 +64,61 @@ function getRandomModifier() { return (multiplierTypes[Math.floor(multiplierTypes.length * randomNumber.random())]); } +function getRandomBonus() { + var bonuses = + [ + [ + ["hacking_chance_mult", 1.25], + ["hacking_speed_mult", 1.15], + ["hacking_money_mult", 1.25], + ["hacking_grow_mult", 1.1], + + ], + [ + ["strength_exp_mult", 1.15], + ["strength_exp_mult", 2] + ], + [ + ["defense_mult", 1.15], + ["defense_exp_mult", 2] + ], + [ + ["dexterity_mult", 1.15], + ["dexterity_exp_mult", 2] + ], + [ + ["agility_mult", 1.15], + ["agility_exp_mult", 2] + ], + [ + ["charisma_mult", 1.15], + ["charisma_exp_mult", 2] + ], + [ + ["hacknet_node_money_mult", 1.2], + ["hacknet_node_purchase_cost_mult", 0.85], + ["hacknet_node_ram_cost_mult", 0.85], + ["hacknet_node_core_cost_mult", 0.85], + ["hacknet_node_level_cost_mult", 0.85] + ], + [ + ["company_rep_mult", 1.25], + ["faction_rep_mult", 1.15], + ["work_money_mult", 1.3] + ], + [ + ["crime_success_mult", 2], + ["crime_money_mult", 2], + ], + ] + + + let randomNumber = (new WHRNG(Math.floor(Player.lastUpdate/360))); + + randomNumber.step(); + return (bonuses[Math.floor(bonuses.length * randomNumber.random())]); +} + function initAugmentations() { for (var name in Factions) { if (Factions.hasOwnProperty(name)) { @@ -75,14 +131,21 @@ function initAugmentations() { //Time-Based Augment Test var randomMod = getRandomModifier(); + var randomBonuses = getRandomBonus(); const CircadianRhythm = new Augmentation({ name:AugmentationNames.CircadianRhythm, moneyCost: 1e12, repCost:450e3, info:"An prototype injection which modifies your circadian rhythm, leading to unexpected effects.

" + - "This augmentation increases or decreases a random skill by a random amount depending on install time.
" + - "Debug:" + randomMod + " by " + getRandomMultiplier(0.85, 1.5) + " " + Math.floor(Player.lastUpdate/3600000), - [randomMod]: getRandomMultiplier(0.85, 1.5), + "This augmentation increases or decreases a random skill by a random amount depending on install time.
" }); + + for (let i = 0; i < randomBonuses.length; i++) { + console.log(`${randomBonuses[i]}`); + CircadianRhythm.mults[randomBonuses[i][0]] = randomBonuses[i][1]; + } + + console.log(CircadianRhythm.mults); + CircadianRhythm.addToFactions(["Speakers for the Dead"]); if (augmentationExists(AugmentationNames.CircadianRhythm)) { delete Augmentations[AugmentationNames.CircadianRhythm]; From 17315733a7340a5a7fb3cc511b014cfee7c671bb Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 16:17:34 -0400 Subject: [PATCH 16/32] deleted unnecessary functions --- src/Augmentation/AugmentationHelpers.jsx | 37 ------------------------ 1 file changed, 37 deletions(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index bdced65ab..a75541f0b 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -28,42 +28,6 @@ function AddToAugmentations(aug) { Augmentations[name] = aug; } -function getRandomMultiplier(min, max) { - let randomNumber = (new WHRNG(Math.floor(Player.lastUpdate/3600000))); - randomNumber.step(); - return (min + (max - min) * (randomNumber.random())); -} - -function getRandomModifier() { - var multiplierTypes = - ["hacking_chance_mult", - "hacking_speed_mult", - "hacking_money_mult", - "hacking_grow_mult", - "hacking_mult", - "strength_mult", - "defense_mult", - "dexterity_mult", - "agility_mult", - "charisma_mult", - "hacking_exp_mult", - "strength_exp_mult", - "defense_exp_mult", - "dexterity_exp_mult", - "agility_exp_mult", - "charisma_exp_mult", - "company_rep_mult", - "faction_rep_mult", - "crime_money_mult", - "crime_success_mult", - "work_money_mult"]; - - let randomNumber = (new WHRNG(Math.floor(Player.lastUpdate/3600000))); - - randomNumber.step(); - return (multiplierTypes[Math.floor(multiplierTypes.length * randomNumber.random())]); -} - function getRandomBonus() { var bonuses = [ @@ -130,7 +94,6 @@ function initAugmentations() { clearObject(Augmentations); //Time-Based Augment Test - var randomMod = getRandomModifier(); var randomBonuses = getRandomBonus(); const CircadianRhythm = new Augmentation({ From 1427a0f1ae431604c59af13351bf89230b807f69 Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 16:20:35 -0400 Subject: [PATCH 17/32] Modified RNG gen for testing --- src/Augmentation/AugmentationHelpers.jsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index a75541f0b..d125d4a1d 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -77,9 +77,12 @@ function getRandomBonus() { ] - let randomNumber = (new WHRNG(Math.floor(Player.lastUpdate/360))); + let randomNumber = (new WHRNG(Math.floor(Player.lastUpdate/36))); + + for(let i = 0; i < 3; i++){ + randomNumber.step(); + } - randomNumber.step(); return (bonuses[Math.floor(bonuses.length * randomNumber.random())]); } From e320a8339a8d45e102766f86bd142e125496d17e Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 16:23:09 -0400 Subject: [PATCH 18/32] added extended info to augment --- src/Augmentation/AugmentationHelpers.jsx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index d125d4a1d..d9ae50add 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -102,15 +102,18 @@ function initAugmentations() { const CircadianRhythm = new Augmentation({ name:AugmentationNames.CircadianRhythm, moneyCost: 1e12, repCost:450e3, info:"An prototype injection which modifies your circadian rhythm, leading to unexpected effects.

" + - "This augmentation increases or decreases a random skill by a random amount depending on install time.
" + "This augmentation currently modifies these values:
" }); + for (let i = 0; i < randomBonuses.length; i++) { console.log(`${randomBonuses[i]}`); CircadianRhythm.mults[randomBonuses[i][0]] = randomBonuses[i][1]; + CircadianRhythm.info += `${randomBonuses[i][0]} by ${Math.round(100 * randomBonuses[i][1].toFixed(2))}%
` } - console.log(CircadianRhythm.mults); + + console.log(CircadianRhythm.info); CircadianRhythm.addToFactions(["Speakers for the Dead"]); if (augmentationExists(AugmentationNames.CircadianRhythm)) { From c793a076dbd7bee5d092a8f6f9de9b6261df247c Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 16:30:06 -0400 Subject: [PATCH 19/32] Changed price and rep. cost of augment --- src/Augmentation/AugmentationHelpers.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index d9ae50add..489d1ac90 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -100,7 +100,7 @@ function initAugmentations() { var randomBonuses = getRandomBonus(); const CircadianRhythm = new Augmentation({ - name:AugmentationNames.CircadianRhythm, moneyCost: 1e12, repCost:450e3, + name:AugmentationNames.CircadianRhythm, moneyCost: 1e9, repCost:4.5e3, info:"An prototype injection which modifies your circadian rhythm, leading to unexpected effects.

" + "This augmentation currently modifies these values:
" }); From 8259c1a5b96c8e2f3e1fb2d5eb98191e3e966e9a Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Thu, 3 Jun 2021 16:54:43 -0400 Subject: [PATCH 20/32] Reset RNG to reload every hour --- src/Augmentation/AugmentationHelpers.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index 489d1ac90..784962004 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -77,7 +77,7 @@ function getRandomBonus() { ] - let randomNumber = (new WHRNG(Math.floor(Player.lastUpdate/36))); + let randomNumber = (new WHRNG(Math.floor(Player.lastUpdate/3600000))); for(let i = 0; i < 3; i++){ randomNumber.step(); From 49cc25479e87fabc1c555af1115d45cf90558901 Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Fri, 4 Jun 2021 08:55:06 -0400 Subject: [PATCH 21/32] Modified flavortext --- src/Augmentation/AugmentationHelpers.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index 784962004..aceb384d6 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -101,7 +101,7 @@ function initAugmentations() { const CircadianRhythm = new Augmentation({ name:AugmentationNames.CircadianRhythm, moneyCost: 1e9, repCost:4.5e3, - info:"An prototype injection which modifies your circadian rhythm, leading to unexpected effects.

" + + info:"A prototype injection which modifies your circadian rhythm, leading to varied effects.

" + "This augmentation currently modifies these values:
" }); From 66ff040e38b3394e0aef1c109916154b5e9cceb2 Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Fri, 4 Jun 2021 11:59:23 -0400 Subject: [PATCH 22/32] Attempt at fixing Int. not resetting on b1t_flum3.exe usage --- src/RedPill.js | 3 +++ src/ui/CharacterInfo.tsx | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/RedPill.js b/src/RedPill.js index 987a49371..b008844d1 100644 --- a/src/RedPill.js +++ b/src/RedPill.js @@ -309,6 +309,9 @@ function createBitNodeYesNoEventListener(newBitNode, destroyedBitNode, flume=fal // If player used flume, subtract 300 int exp. The prestigeSourceFile() // function below grants 300 int exp, so this allows sets net gain to 0 Player.gainIntelligenceExp(-300); + if(SourceFileFlags[5] === 0) { + Player.intelligence = 0; + } } redPillFlag = false; var container = document.getElementById("red-pill-content"); diff --git a/src/ui/CharacterInfo.tsx b/src/ui/CharacterInfo.tsx index 04f29e4a0..91f335f8f 100644 --- a/src/ui/CharacterInfo.tsx +++ b/src/ui/CharacterInfo.tsx @@ -80,7 +80,7 @@ export function CharacterInfo(p: IPlayer): React.ReactElement { } function Intelligence(): React.ReactElement { - if (p.intelligence > 0) { + if (p.intelligence > 0 && (p.bitNodeN === 5 || SourceFileFlags[5] > 0)) { return Intelligence: {numeralWrapper.formatSkill(p.intelligence)} From fc5e0ea6a0543518ab7dc7691d5627630e2d7fe0 Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Fri, 4 Jun 2021 12:02:26 -0400 Subject: [PATCH 23/32] Set intelligence_exp to 0 if player does not have SourceFile 5 on b1t_flum3.exe usage --- src/RedPill.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/RedPill.js b/src/RedPill.js index b008844d1..f3b245597 100644 --- a/src/RedPill.js +++ b/src/RedPill.js @@ -311,6 +311,7 @@ function createBitNodeYesNoEventListener(newBitNode, destroyedBitNode, flume=fal Player.gainIntelligenceExp(-300); if(SourceFileFlags[5] === 0) { Player.intelligence = 0; + Player.intelligence_exp = 0; } } redPillFlag = false; From f9ff45fbed274458513b2de41606dc12009f3fb7 Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Fri, 4 Jun 2021 12:14:04 -0400 Subject: [PATCH 24/32] Attempt at making Int. available from start of BN5 --- src/RedPill.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/RedPill.js b/src/RedPill.js index f3b245597..94e7baa3a 100644 --- a/src/RedPill.js +++ b/src/RedPill.js @@ -305,6 +305,13 @@ function createBitNodeYesNoEventListener(newBitNode, destroyedBitNode, flume=fal yesBtn.addEventListener("click", function() { if (!flume) { giveSourceFile(destroyedBitNode); + if (newBitNode === 5) { + if(Player.intelligence === 0) { + Player.intelligence = 1; + Player.updateSkillLevels(); + } + } + } else { // If player used flume, subtract 300 int exp. The prestigeSourceFile() // function below grants 300 int exp, so this allows sets net gain to 0 @@ -312,6 +319,13 @@ function createBitNodeYesNoEventListener(newBitNode, destroyedBitNode, flume=fal if(SourceFileFlags[5] === 0) { Player.intelligence = 0; Player.intelligence_exp = 0; + Player.updateSkillLevels(); + } + if (newBitNode === 5) { + if(Player.intelligence === 0) { + Player.intelligence = 1; + Player.updateSkillLevels(); + } } } redPillFlag = false; From ed041743c28f2ac116a61d52da41a94b9e7f4ee3 Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Fri, 4 Jun 2021 12:17:46 -0400 Subject: [PATCH 25/32] Allows player to keep int if bitfluming into SF5 from SF5 for some reason --- src/RedPill.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/RedPill.js b/src/RedPill.js index 94e7baa3a..c47997fd9 100644 --- a/src/RedPill.js +++ b/src/RedPill.js @@ -316,7 +316,7 @@ function createBitNodeYesNoEventListener(newBitNode, destroyedBitNode, flume=fal // If player used flume, subtract 300 int exp. The prestigeSourceFile() // function below grants 300 int exp, so this allows sets net gain to 0 Player.gainIntelligenceExp(-300); - if(SourceFileFlags[5] === 0) { + if(SourceFileFlags[5] === 0 || newBitNode !== 5) { Player.intelligence = 0; Player.intelligence_exp = 0; Player.updateSkillLevels(); From 80125d152152b1329727d351bc3167869829067f Mon Sep 17 00:00:00 2001 From: Tesseract1234567890 Date: Fri, 4 Jun 2021 13:55:33 -0400 Subject: [PATCH 26/32] Fixed bladeburner stats not displaying correctly --- src/Augmentation/ui/PlayerMultipliers.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Augmentation/ui/PlayerMultipliers.tsx b/src/Augmentation/ui/PlayerMultipliers.tsx index c64a5203d..79a80db7f 100644 --- a/src/Augmentation/ui/PlayerMultipliers.tsx +++ b/src/Augmentation/ui/PlayerMultipliers.tsx @@ -48,10 +48,10 @@ export function PlayerMultipliers(): React.ReactElement { if(!Player.canAccessBladeburner()) return (<>); return (<> {MultiplierTable([ - ['Bladeburner Success Chance', Player.bladeburner_max_stamina_mult, Player.bladeburner_max_stamina_mult*mults.bladeburner_max_stamina_mult], + ['Bladeburner Success Chance', Player.bladeburner_success_chance_mult, Player.bladeburner_success_chance_mult*mults.bladeburner_success_chance_mult], ['Bladeburner Max Stamina', Player.bladeburner_max_stamina_mult, Player.bladeburner_max_stamina_mult*mults.bladeburner_max_stamina_mult], - ['Bladeburner Stamina Gain', Player.bladeburner_max_stamina_mult, Player.bladeburner_max_stamina_mult*mults.bladeburner_max_stamina_mult], - ['Bladeburner Field Analysis', Player.bladeburner_max_stamina_mult, Player.bladeburner_max_stamina_mult*mults.bladeburner_max_stamina_mult], + ['Bladeburner Stamina Gain', Player.bladeburner_stamina_gain_mult, Player.bladeburner_stamina_gain_mult*mults.bladeburner_stamina_gain_mult], + ['Bladeburner Field Analysis', Player.bladeburner_analysis_mult, Player.bladeburner_analysis_mult*mults.bladeburner_analysis_mult], ])}
); } From 2c2548f8567329456540c0fdfafcf87903c22ea4 Mon Sep 17 00:00:00 2001 From: Olivier Gagnon Date: Sun, 6 Jun 2021 12:00:59 -0400 Subject: [PATCH 27/32] dev menu is now save-file sensitive, Fixed some bugs related to BN5-1 int --- src/DevMenu.jsx | 19 ++++++++++++++++--- src/Prestige.js | 5 +++-- src/RedPill.js | 28 +++++++--------------------- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/DevMenu.jsx b/src/DevMenu.jsx index 20e61f83e..24ea78b56 100644 --- a/src/DevMenu.jsx +++ b/src/DevMenu.jsx @@ -14,6 +14,7 @@ import { AllServers } from "./Server/AllServers"; import { GetServerByHostname } from "./Server/ServerHelpers"; import { hackWorldDaemon } from "./RedPill"; import { StockMarket } from "./StockMarket/StockMarket"; +import { Bladeburner } from "./Bladeburner"; import { Stock } from "./StockMarket/Stock"; import { Engine } from "./engine"; import { saveObject } from "./SaveObject"; @@ -145,6 +146,10 @@ class DevMenuComponent extends Component { hackWorldDaemon(Player.bitNodeN, true); } + quickHackW0r1dD43m0n() { + hackWorldDaemon(Player.bitNodeN, false, true); + } + hackW0r1dD43m0n() { hackWorldDaemon(Player.bitNodeN); } @@ -708,7 +713,6 @@ class DevMenuComponent extends Component { contractTypes.push(); } - return (
@@ -728,6 +732,7 @@ class DevMenuComponent extends Component {
+
@@ -1066,6 +1071,7 @@ class DevMenuComponent extends Component {
+ {Player.bladeburner instanceof Bladeburner &&
@@ -1101,7 +1107,9 @@ class DevMenuComponent extends Component {
+ } + {Player.inGang() &&
@@ -1125,7 +1133,9 @@ class DevMenuComponent extends Component {
+ } + {Player.hasCorporation() &&
@@ -1152,6 +1162,7 @@ class DevMenuComponent extends Component {
+ }
@@ -1181,7 +1192,7 @@ class DevMenuComponent extends Component {
- + {Player.hasWseAccount &&
@@ -1208,8 +1219,9 @@ class DevMenuComponent extends Component {
+ } - + {Player.sleeves.length > 0 &&
@@ -1231,6 +1243,7 @@ class DevMenuComponent extends Component {
+ }
diff --git a/src/Prestige.js b/src/Prestige.js index 777690b98..48fc82167 100755 --- a/src/Prestige.js +++ b/src/Prestige.js @@ -176,7 +176,7 @@ function prestigeAugmentation() { // Prestige by destroying Bit Node and gaining a Source File -function prestigeSourceFile() { +function prestigeSourceFile(flume) { initBitNodeMultipliers(Player); updateSourceFileFlags(Player); @@ -350,7 +350,8 @@ function prestigeSourceFile() { document.getElementById("world-menu-header").click(); // Gain int exp - Player.gainIntelligenceExp(300); + if(SourceFileFlags[5] !== 0 && !flume) + Player.gainIntelligenceExp(300); resetPidCounter(); } diff --git a/src/RedPill.js b/src/RedPill.js index c47997fd9..0858dbc5a 100644 --- a/src/RedPill.js +++ b/src/RedPill.js @@ -134,7 +134,7 @@ function giveSourceFile(bitNodeNumber) { } else { var playerSrcFile = new PlayerOwnedSourceFile(bitNodeNumber, 1); Player.sourceFiles.push(playerSrcFile); - if (bitNodeNumber === 5) { // Artificial Intelligence + if (bitNodeNumber === 5 && Player.intelligence === 0) { // Artificial Intelligence Player.intelligence = 1; } dialogBoxCreate("You received a Source-File for destroying a Bit Node!

" + @@ -305,31 +305,17 @@ function createBitNodeYesNoEventListener(newBitNode, destroyedBitNode, flume=fal yesBtn.addEventListener("click", function() { if (!flume) { giveSourceFile(destroyedBitNode); - if (newBitNode === 5) { - if(Player.intelligence === 0) { - Player.intelligence = 1; - Player.updateSkillLevels(); - } - } - } else { - // If player used flume, subtract 300 int exp. The prestigeSourceFile() - // function below grants 300 int exp, so this allows sets net gain to 0 - Player.gainIntelligenceExp(-300); - if(SourceFileFlags[5] === 0 || newBitNode !== 5) { + if(SourceFileFlags[5] === 0 && newBitNode !== 5) { Player.intelligence = 0; Player.intelligence_exp = 0; - Player.updateSkillLevels(); - } - if (newBitNode === 5) { - if(Player.intelligence === 0) { - Player.intelligence = 1; - Player.updateSkillLevels(); - } } } + if (newBitNode === 5 && Player.intelligence === 0) { + Player.intelligence = 1; + } redPillFlag = false; - var container = document.getElementById("red-pill-content"); + const container = document.getElementById("red-pill-content"); removeChildrenFromElement(container); // Set new Bit Node @@ -341,7 +327,7 @@ function createBitNodeYesNoEventListener(newBitNode, destroyedBitNode, flume=fal document.getElementById("terminal-input-td").innerHTML = '$ '; $('input[class=terminal-input]').prop('disabled', false); - prestigeSourceFile(); + prestigeSourceFile(flume); yesNoBoxClose(); }); const noBtn = yesNoBoxGetNoButton(); From 40813d5c4f554665a56b2625445bcb7013662bc2 Mon Sep 17 00:00:00 2001 From: Olivier Gagnon Date: Sun, 6 Jun 2021 13:28:25 -0400 Subject: [PATCH 28/32] Finish work on the gimick time-based aug --- src/Augmentation/AugmentationHelpers.jsx | 159 ++++++++++++--------- src/Augmentation/data/AugmentationNames.ts | 2 +- src/DevMenu.jsx | 2 +- 3 files changed, 91 insertions(+), 72 deletions(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index 1dde00ec4..8e976dc35 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -31,57 +31,81 @@ function AddToAugmentations(aug) { function getRandomBonus() { var bonuses = [ - [ - ["hacking_chance_mult", 1.25], - ["hacking_speed_mult", 1.15], - ["hacking_money_mult", 1.25], - ["hacking_grow_mult", 1.1], - - ], - [ - ["strength_exp_mult", 1.15], - ["strength_exp_mult", 2] - ], - [ - ["defense_mult", 1.15], - ["defense_exp_mult", 2] - ], - [ - ["dexterity_mult", 1.15], - ["dexterity_exp_mult", 2] - ], - [ - ["agility_mult", 1.15], - ["agility_exp_mult", 2] - ], - [ - ["charisma_mult", 1.15], - ["charisma_exp_mult", 2] - ], - [ - ["hacknet_node_money_mult", 1.2], - ["hacknet_node_purchase_cost_mult", 0.85], - ["hacknet_node_ram_cost_mult", 0.85], - ["hacknet_node_core_cost_mult", 0.85], - ["hacknet_node_level_cost_mult", 0.85] - ], - [ - ["company_rep_mult", 1.25], - ["faction_rep_mult", 1.15], - ["work_money_mult", 1.3] - ], - [ - ["crime_success_mult", 2], - ["crime_money_mult", 2], - ], + { + bonuses: { + hacking_chance_mult: 1.25, + hacking_speed_mult: 1.10, + hacking_money_mult: 1.25, + hacking_grow_mult: 1.1 + }, + description: "Increases the player's hacking chance by 25%.
" + + "Increases the player's hacking speed by 10%.
" + + "Increases the amount of money the player's gains from hacking by 25%.
" + + "Increases the amount of money the player can inject into servers using grow() by 10%." + }, + { + bonuses: { + hacking_mult: 1.15, + hacking_exp_mult: 2 + }, + description: "Increases the player's hacking skill by 15%.
" + + "Increases the player's hacking experience gain rate by 100%." + }, + { + bonuses: { + strength_mult: 1.25, + strength_exp_mult: 1.5, + defense_mult: 1.25, + defense_exp_mult: 1.5, + dexterity_mult: 1.25, + dexterity_exp_mult: 1.5, + agility_mult: 1.25, + agility_exp_mult: 1.5 + }, + description: "Increases all of the player's combat stats by 25%.
" + + "Increases all of the player's combat stat experience gain rate by 100%." + }, + { + bonuses: { + charisma_mult: 1.5, + charisma_exp_mult: 2 + }, + description: "This augmentation increases the player's charisma by 50%.
" + + "Increases the player's charisma experience gain rate by 100%." + }, + { + bonuses: { + hacknet_node_money_mult: 1.2, + hacknet_node_purchase_cost_mult: 0.85, + hacknet_node_ram_cost_mult: 0.85, + hacknet_node_core_cost_mult: 0.85, + hacknet_node_level_cost_mult: 0.85 + }, + description: "Increases the amount of money produced by Hacknet Nodes by 20%.
" + + "Decreases all costs related to Hacknet Node by 15%." + }, + { + bonuses: { + company_rep_mult: 1.25, + faction_rep_mult: 1.15, + work_money_mult: 1.7 + }, + description: "Increases the amount of money the player gains from working by 70%.
" + + "Increases the amount of reputation the player gains when working for a company by 25%.
" + + "Increases the amount of reputation the player gains for a faction by 15%." + }, + { + bonuses: { + crime_success_mult: 2, + crime_money_mult: 2 + }, + description: "Increases the player's crime success rate by 100%.
" + + "Increases the amount of money the player gains from crimes by 100%." + } ] - - let randomNumber = (new WHRNG(Math.floor(Player.lastUpdate/3600000))); - - for(let i = 0; i < 3; i++){ - randomNumber.step(); - } + const randomNumber = (new WHRNG(Math.floor(Player.lastUpdate/3600000))); + for(let i = 0; i < 5; i++) randomNumber.step(); return (bonuses[Math.floor(bonuses.length * randomNumber.random())]); } @@ -97,29 +121,23 @@ function initAugmentations() { clearObject(Augmentations); //Time-Based Augment Test - var randomBonuses = getRandomBonus(); + const randomBonuses = getRandomBonus(); - const CircadianRhythm = new Augmentation({ - name:AugmentationNames.CircadianRhythm, moneyCost: 1e9, repCost:4.5e3, - info:"A prototype injection which modifies your circadian rhythm, leading to varied effects.

" + - "This augmentation currently modifies these values:
" + const UnstableCircadianModulator = new Augmentation({ + name:AugmentationNames.UnstableCircadianModulator, moneyCost: 1e9, repCost:145e3, + info:"An experimental nanobot injection. Its unstable nature leads to unpredictable results based on your circadian rhythm.

" + + "This augmentation:
" + randomBonuses.description + "

For now ..." }); - - for (let i = 0; i < randomBonuses.length; i++) { - console.log(`${randomBonuses[i]}`); - CircadianRhythm.mults[randomBonuses[i][0]] = randomBonuses[i][1]; - CircadianRhythm.info += `${randomBonuses[i][0]} by ${Math.round(100 * randomBonuses[i][1].toFixed(2))}%
` + Object.keys(randomBonuses.bonuses).forEach(key => UnstableCircadianModulator.mults[key] = randomBonuses.bonuses[key]); + + + + UnstableCircadianModulator.addToFactions(["Speakers for the Dead"]); + if (augmentationExists(AugmentationNames.UnstableCircadianModulator)) { + delete Augmentations[AugmentationNames.UnstableCircadianModulator]; } - - - console.log(CircadianRhythm.info); - - CircadianRhythm.addToFactions(["Speakers for the Dead"]); - if (augmentationExists(AugmentationNames.CircadianRhythm)) { - delete Augmentations[AugmentationNames.CircadianRhythm]; - } - AddToAugmentations(CircadianRhythm); + AddToAugmentations(UnstableCircadianModulator); //Combat stat augmentations const HemoRecirculator = new Augmentation({ @@ -1467,8 +1485,9 @@ function initAugmentations() { info:"The left arm of a legendary BitRunner who ascended beyond this world. " + "It projects a light blue energy shield that protects the exposed inner parts. " + "Even though it contains no weapons, the advance tungsten titanium " + - "alloy increases the users strength to unbelievable levels.

" + - "This augmentation increases the player's strength by 300%.", + "alloy increases the users strength to unbelievable levels. The augmentation " + + "gets more powerful over time for seemingly no reason.

" + + "This augmentation increases the player's strength by 270%.", strength_mult: 2.70, }); HydroflameLeftArm.addToFactions(["NWO"]); diff --git a/src/Augmentation/data/AugmentationNames.ts b/src/Augmentation/data/AugmentationNames.ts index c889a8dfc..dc60d3ae5 100644 --- a/src/Augmentation/data/AugmentationNames.ts +++ b/src/Augmentation/data/AugmentationNames.ts @@ -1,7 +1,6 @@ import { IMap } from "../../types"; export const AugmentationNames: IMap = { - CircadianRhythm: "Circadian Modulator", Targeting1: "Augmented Targeting I", Targeting2: "Augmented Targeting II", Targeting3: "Augmented Targeting III", @@ -79,6 +78,7 @@ export const AugmentationNames: IMap = { PhotosyntheticCells: "Photosynthetic Cells", Neurolink: "BitRunners Neurolink", TheBlackHand: "The Black Hand", + UnstableCircadianModulator: "Unstable Circadian Modulator", CRTX42AA: "CRTX42-AA Gene Modification", Neuregen: "Neuregen Gene Modification", CashRoot: "CashRoot Starter Kit", diff --git a/src/DevMenu.jsx b/src/DevMenu.jsx index 24ea78b56..52b54e9a0 100644 --- a/src/DevMenu.jsx +++ b/src/DevMenu.jsx @@ -746,7 +746,7 @@ class DevMenuComponent extends Component { All: - + From 0b401ba83b5ba7a05737053b5222c7f4011faff8 Mon Sep 17 00:00:00 2001 From: Olivier Gagnon Date: Sun, 6 Jun 2021 14:17:03 -0400 Subject: [PATCH 29/32] collapse 2 constants in where they are used. --- src/Augmentation/Augmentation.ts | 4 +- src/Augmentation/AugmentationHelpers.jsx | 218 +++++++++++------------ src/Constants.ts | 2 - src/Faction/FactionHelpers.jsx | 4 +- 4 files changed, 113 insertions(+), 115 deletions(-) diff --git a/src/Augmentation/Augmentation.ts b/src/Augmentation/Augmentation.ts index 283265fae..853011c51 100644 --- a/src/Augmentation/Augmentation.ts +++ b/src/Augmentation/Augmentation.ts @@ -86,8 +86,8 @@ export class Augmentation { this.info = params.info; this.prereqs = params.prereqs ? params.prereqs : []; - this.baseRepRequirement = params.repCost * CONSTANTS.AugmentationRepMultiplier * BitNodeMultipliers.AugmentationRepCost; - this.baseCost = params.moneyCost * CONSTANTS.AugmentationCostMultiplier * BitNodeMultipliers.AugmentationMoneyCost; + this.baseRepRequirement = params.repCost * BitNodeMultipliers.AugmentationRepCost; + this.baseCost = params.moneyCost * BitNodeMultipliers.AugmentationMoneyCost; this.startingCost = this.baseCost; if (params.isSpecial) { diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index 8e976dc35..e9951f328 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -124,7 +124,7 @@ function initAugmentations() { const randomBonuses = getRandomBonus(); const UnstableCircadianModulator = new Augmentation({ - name:AugmentationNames.UnstableCircadianModulator, moneyCost: 1e9, repCost:145e3, + name:AugmentationNames.UnstableCircadianModulator, moneyCost:5e9, repCost:3.625e5, info:"An experimental nanobot injection. Its unstable nature leads to unpredictable results based on your circadian rhythm.

" + "This augmentation:
" + randomBonuses.description + "

For now ..." }); @@ -141,7 +141,7 @@ function initAugmentations() { //Combat stat augmentations const HemoRecirculator = new Augmentation({ - name:AugmentationNames.HemoRecirculator, moneyCost: 9e6, repCost:4e3, + name:AugmentationNames.HemoRecirculator, moneyCost:4.5e7, repCost:1e4, info:"A heart implant that greatly increases the body's ability to effectively use and pump " + "blood.

" + "This augmentation increases all of the player's combat stats by 8%.", @@ -157,7 +157,7 @@ function initAugmentations() { AddToAugmentations(HemoRecirculator); const Targeting1 = new Augmentation({ - name:AugmentationNames.Targeting1, moneyCost:3e6, repCost:2e3, + name:AugmentationNames.Targeting1, moneyCost:1.5e7, repCost:5e3, info:"This cranial implant is embedded within the player's inner ear structure and optic nerves. It regulates and enhances the user's " + "balance and hand-eye coordination. It is also capable of augmenting reality by projecting digital information " + "directly onto the retina. These enhancements allow the player to better lock-on and keep track of enemies.

" + @@ -172,7 +172,7 @@ function initAugmentations() { AddToAugmentations(Targeting1); const Targeting2 = new Augmentation({ - name:AugmentationNames.Targeting2, moneyCost:8.5e6, repCost:3.5e3, + name:AugmentationNames.Targeting2, moneyCost:4.25e7, repCost:8.75e3, info:"This is an upgrade of the Augmented Targeting I cranial implant, which is capable of augmenting reality " + "and enhances the user's balance and hand-eye coordination.

" + "This augmentation increases the player's dexterity by 20%.", @@ -187,7 +187,7 @@ function initAugmentations() { AddToAugmentations(Targeting2); const Targeting3 = new Augmentation({ - name:AugmentationNames.Targeting3, moneyCost:23e6, repCost:11e3, + name:AugmentationNames.Targeting3, moneyCost:1.15e8, repCost:2.75e4, info:"This is an upgrade of the Augmented Targeting II cranial implant, which is capable of augmenting reality " + "and enhances the user's balance and hand-eye coordination.

" + "This augmentation increases the player's dexterity by 30%.", @@ -202,7 +202,7 @@ function initAugmentations() { AddToAugmentations(Targeting3); const SyntheticHeart = new Augmentation({ - name:AugmentationNames.SyntheticHeart, moneyCost:575e6, repCost:300e3, + name:AugmentationNames.SyntheticHeart, moneyCost:2.875e9, repCost:7.5e5, info:"This advanced artificial heart, created from plasteel and graphene, is capable of pumping more blood " + "at much higher efficiencies than a normal human heart.

" + "This augmentation increases the player's agility and strength by 50%.", @@ -217,7 +217,7 @@ function initAugmentations() { AddToAugmentations(SyntheticHeart); const SynfibrilMuscle = new Augmentation({ - name:AugmentationNames.SynfibrilMuscle, repCost:175e3, moneyCost:225e6, + name:AugmentationNames.SynfibrilMuscle, repCost:4.375e5, moneyCost:1.125e9, info:"The myofibrils in human muscles are injected with special chemicals that react with the proteins inside " + "the myofibrils, altering their underlying structure. The end result is muscles that are stronger and more elastic. " + "Scientists have named these artificially enhanced units 'synfibrils'.

" + @@ -233,7 +233,7 @@ function initAugmentations() { AddToAugmentations(SynfibrilMuscle) const CombatRib1 = new Augmentation({ - name:AugmentationNames.CombatRib1, repCost:3e3, moneyCost:4750000, + name:AugmentationNames.CombatRib1, repCost:7.5e3, moneyCost:2.375e7, info:"The human body's ribs are replaced with artificial ribs that automatically and continuously release cognitive " + "and performance-enhancing drugs into the bloodstream, improving the user's abilities in combat.

" + "This augmentation increases the player's strength and defense by 10%.", @@ -248,7 +248,7 @@ function initAugmentations() { AddToAugmentations(CombatRib1); const CombatRib2 = new Augmentation({ - name:AugmentationNames.CombatRib2, repCost:7.5e3, moneyCost:13e6, + name:AugmentationNames.CombatRib2, repCost:1.875e4, moneyCost:6.5e7, info:"This is an upgrade to the Combat Rib I augmentation, and is capable of releasing even more potent combat-enhancing " + "drugs into the bloodstream.

" + "This augmentation increases the player's strength and defense by 14%.", @@ -264,7 +264,7 @@ function initAugmentations() { AddToAugmentations(CombatRib2); const CombatRib3 = new Augmentation({ - name:AugmentationNames.CombatRib3, repCost:14e3, moneyCost:24e6, + name:AugmentationNames.CombatRib3, repCost:3.5e4, moneyCost:1.2e8, info:"This is an upgrade to the Combat Rib II augmentation, and is capable of releasing even more potent combat-enhancing " + "drugs into the bloodstream.

" + "This augmentation increases the player's strength and defense by 18%.", @@ -280,7 +280,7 @@ function initAugmentations() { AddToAugmentations(CombatRib3); const NanofiberWeave = new Augmentation({ - name:AugmentationNames.NanofiberWeave, repCost:15e3, moneyCost:25e6, + name:AugmentationNames.NanofiberWeave, repCost:3.75e4, moneyCost:1.25e8, info:"Synthetic nanofibers are woven into the skin's extracellular matrix using electrospinning. " + "This improves the skin's ability to regenerate itself and protect the body from external stresses and forces.

" + "This augmentation increases the player's strength and defense by 20%.", @@ -295,7 +295,7 @@ function initAugmentations() { AddToAugmentations(NanofiberWeave); const SubdermalArmor = new Augmentation({ - name:AugmentationNames.SubdermalArmor, repCost:350e3, moneyCost:650e6, + name:AugmentationNames.SubdermalArmor, repCost:8.75e5, moneyCost:3.25e9, info:"The NEMEAN Subdermal Weave is a thin, light-weight, graphene plating that houses a dilatant fluid. " + "The material is implanted underneath the skin, and is the most advanced form of defensive enhancement " + "that has ever been created. The dilatant fluid, despite being thin and light, is extremely effective " + @@ -312,7 +312,7 @@ function initAugmentations() { AddToAugmentations(SubdermalArmor); const WiredReflexes = new Augmentation({ - name:AugmentationNames.WiredReflexes, repCost:500, moneyCost:500e3, + name:AugmentationNames.WiredReflexes, repCost:1.25e3, moneyCost:2.5e6, info:"Synthetic nerve-enhancements are injected into all major parts of the somatic nervous system, " + "supercharging the body's ability to send signals through neurons. This results in increased reflex speed.

" + "This augmentation increases the player's agility and dexterity by 5%.", @@ -327,7 +327,7 @@ function initAugmentations() { AddToAugmentations(WiredReflexes); const GrapheneBoneLacings = new Augmentation({ - name:AugmentationNames.GrapheneBoneLacings, repCost:450e3, moneyCost:850e6, + name:AugmentationNames.GrapheneBoneLacings, repCost:1.125e6, moneyCost:4.25e9, info:"A graphene-based material is grafted and fused into the user's bones, significantly increasing " + "their density and tensile strength.

" + "This augmentation increases the player's strength and defense by 70%.", @@ -341,7 +341,7 @@ function initAugmentations() { AddToAugmentations(GrapheneBoneLacings); const BionicSpine = new Augmentation({ - name:AugmentationNames.BionicSpine, repCost:18e3, moneyCost:25e6, + name:AugmentationNames.BionicSpine, repCost:4.5e4, moneyCost:1.25e8, info:"An artificial spine created from plasteel and carbon fibers that completely replaces the organic spine. " + "Not only is the Bionic Spine physically stronger than a human spine, but it is also capable of digitally " + "stimulating and regulating the neural signals that are sent and received by the spinal cord. This results in " + @@ -360,7 +360,7 @@ function initAugmentations() { AddToAugmentations(BionicSpine); const GrapheneBionicSpine = new Augmentation({ - name:AugmentationNames.GrapheneBionicSpine, repCost:650e3, moneyCost:1200e6, + name:AugmentationNames.GrapheneBionicSpine, repCost:1.625e6, moneyCost:6e9, info:"An upgrade to the Bionic Spine augmentation. It fuses the implant with an advanced graphene " + "material to make it much stronger and lighter.

" + "This augmentation increases all of the player's combat stats by 60%.", @@ -377,7 +377,7 @@ function initAugmentations() { AddToAugmentations(GrapheneBionicSpine); const BionicLegs = new Augmentation({ - name:AugmentationNames.BionicLegs, repCost:60e3, moneyCost:75e6, + name:AugmentationNames.BionicLegs, repCost:1.5e5, moneyCost:3.75e8, info:"Cybernetic legs created from plasteel and carbon fibers that completely replace the user's organic legs.

" + "This augmentation increases the player's agility by 60%.", agility_mult: 1.6, @@ -390,7 +390,7 @@ function initAugmentations() { AddToAugmentations(BionicLegs); const GrapheneBionicLegs = new Augmentation({ - name:AugmentationNames.GrapheneBionicLegs, repCost:300e3, moneyCost:900e6, + name:AugmentationNames.GrapheneBionicLegs, repCost:7.5e5, moneyCost:4.5e9, info:"An upgrade to the Bionic Legs augmentation. It fuses the implant with an advanced graphene " + "material to make it much stronger and lighter.

" + "This augmentation increases the player's agility by 150%.", @@ -405,7 +405,7 @@ function initAugmentations() { // Work stat augmentations const SpeechProcessor = new Augmentation({ - name:AugmentationNames.SpeechProcessor, repCost:3e3, moneyCost:10e6, + name:AugmentationNames.SpeechProcessor, repCost:7.5e3, moneyCost:5e7, info:"A cochlear implant with an embedded computer that analyzes incoming speech. " + "The embedded computer processes characteristics of incoming speech, such as tone " + "and inflection, to pick up on subtle cues and aid in social interactions.

" + @@ -420,7 +420,7 @@ function initAugmentations() { AddToAugmentations(SpeechProcessor); const TITN41Injection = new Augmentation({ - name:AugmentationNames.TITN41Injection, repCost:10e3, moneyCost:38e6, + name:AugmentationNames.TITN41Injection, repCost:2.5e4, moneyCost:1.9e8, info:"TITN is a series of viruses that targets and alters the sequences of human DNA in genes that " + "control personality. The TITN-41 strain alters these genes so that the subject becomes more " + "outgoing and socialable.

" + @@ -435,7 +435,7 @@ function initAugmentations() { AddToAugmentations(TITN41Injection); const EnhancedSocialInteractionImplant = new Augmentation({ - name:AugmentationNames.EnhancedSocialInteractionImplant, repCost:150e3, moneyCost:275e6, + name:AugmentationNames.EnhancedSocialInteractionImplant, repCost:3.75e5, moneyCost:1.375e9, info:"A cranial implant that greatly assists in the user's ability to analyze social situations " + "and interactions. The system uses a wide variety of factors such as facial expression, body " + "language, and the voice's tone/inflection to determine the best course of action during social" + @@ -454,7 +454,7 @@ function initAugmentations() { // Hacking augmentations const BitWire = new Augmentation({ - name:AugmentationNames.BitWire, repCost:1500, moneyCost:2e6, + name:AugmentationNames.BitWire, repCost:3.75e3, moneyCost:1e7, info: "A small brain implant embedded in the cerebrum. This regulates and improves the brain's computing " + "capabilities.

" + "This augmentation increases the player's hacking skill by 5%.", @@ -467,7 +467,7 @@ function initAugmentations() { AddToAugmentations(BitWire); const ArtificialBioNeuralNetwork = new Augmentation({ - name:AugmentationNames.ArtificialBioNeuralNetwork, repCost:110e3, moneyCost:600e6, + name:AugmentationNames.ArtificialBioNeuralNetwork, repCost:2.75e5, moneyCost:3e9, info:"A network consisting of millions of nanoprocessors is embedded into the brain. " + "The network is meant to mimick the way a biological brain solves a problem, which each " + "nanoprocessor acting similar to the way a neuron would in a neural network. However, these " + @@ -488,7 +488,7 @@ function initAugmentations() { AddToAugmentations(ArtificialBioNeuralNetwork); const ArtificialSynapticPotentiation = new Augmentation({ - name:AugmentationNames.ArtificialSynapticPotentiation, repCost:2500, moneyCost:16e6, + name:AugmentationNames.ArtificialSynapticPotentiation, repCost:6.25e3, moneyCost:8e7, info:"The body is injected with a chemical that artificially induces synaptic potentiation, " + "otherwise known as the strengthening of synapses. This results in enhanced cognitive abilities.

" + "This augmentation:
" + @@ -506,7 +506,7 @@ function initAugmentations() { AddToAugmentations(ArtificialSynapticPotentiation); const EnhancedMyelinSheathing = new Augmentation({ - name:AugmentationNames.EnhancedMyelinSheathing, repCost:40e3, moneyCost:275e6, + name:AugmentationNames.EnhancedMyelinSheathing, repCost:1e5, moneyCost:1.375e9, info:"Electrical signals are used to induce a new, artificial form of myelinogensis in the human body. " + "This process results in the proliferation of new, synthetic myelin sheaths in the nervous " + "system. These myelin sheaths can propogate neuro-signals much faster than their organic " + @@ -526,7 +526,7 @@ function initAugmentations() { AddToAugmentations(EnhancedMyelinSheathing); const SynapticEnhancement = new Augmentation({ - name:AugmentationNames.SynapticEnhancement, repCost:800, moneyCost:1.5e6, + name:AugmentationNames.SynapticEnhancement, repCost:2e3, moneyCost:7.5e6, info:"A small cranial implant that continuously uses weak electric signals to stimulate the brain and " + "induce stronger synaptic activity. This improves the user's cognitive abilities.

" + "This augmentation increases the player's hacking speed by 3%.", @@ -539,7 +539,7 @@ function initAugmentations() { AddToAugmentations(SynapticEnhancement); const NeuralRetentionEnhancement = new Augmentation({ - name:AugmentationNames.NeuralRetentionEnhancement, repCost:8e3, moneyCost:50e6, + name:AugmentationNames.NeuralRetentionEnhancement, repCost:2e4, moneyCost:2.5e8, info:"Chemical injections are used to permanently alter and strengthen the brain's neuronal " + "circuits, strengthening its ability to retain information.

" + "This augmentation increases the player's hacking experience gain rate by 25%.", @@ -552,7 +552,7 @@ function initAugmentations() { AddToAugmentations(NeuralRetentionEnhancement); const DataJack = new Augmentation({ - name:AugmentationNames.DataJack, repCost:45e3, moneyCost:90e6, + name:AugmentationNames.DataJack, repCost:1.125e5, moneyCost:4.5e8, info:"A brain implant that provides an interface for direct, wireless communication between a computer's main " + "memory and the mind. This implant allows the user to not only access a computer's memory, but also alter " + "and delete it.

" + @@ -566,7 +566,7 @@ function initAugmentations() { AddToAugmentations(DataJack); const ENM = new Augmentation({ - name:AugmentationNames.ENM, repCost:6e3, moneyCost:50e6, + name:AugmentationNames.ENM, repCost:1.5e4, moneyCost:2.5e8, info:"A thin device embedded inside the arm containing a wireless module capable of connecting " + "to nearby networks. Once connected, the Netburner Module is capable of capturing and " + "processing all of the traffic on that network. By itself, the Embedded Netburner Module does " + @@ -583,7 +583,7 @@ function initAugmentations() { AddToAugmentations(ENM); const ENMCore = new Augmentation({ - name:AugmentationNames.ENMCore, repCost:100e3, moneyCost:500e6, + name:AugmentationNames.ENMCore, repCost:2.5e5, moneyCost:2.5e9, info:"The Core library is an implant that upgrades the firmware of the Embedded Netburner Module. " + "This upgrade allows the Embedded Netburner Module to generate its own data on a network.

" + "This augmentation:
" + @@ -607,7 +607,7 @@ function initAugmentations() { AddToAugmentations(ENMCore); const ENMCoreV2 = new Augmentation({ - name:AugmentationNames.ENMCoreV2, repCost:400e3, moneyCost:900e6, + name:AugmentationNames.ENMCoreV2, repCost:1e6, moneyCost:4.5e9, info:"The Core V2 library is an implant that upgrades the firmware of the Embedded Netburner Module. " + "This upgraded firmware allows the Embedded Netburner Module to control the information on " + "a network by re-routing traffic, spoofing IP addresses, or altering the data inside network " + @@ -633,7 +633,7 @@ function initAugmentations() { AddToAugmentations(ENMCoreV2); const ENMCoreV3 = new Augmentation({ - name:AugmentationNames.ENMCoreV3, repCost:700e3, moneyCost:1500e6, + name:AugmentationNames.ENMCoreV3, repCost:1.75e6, moneyCost:7.5e9, info:"The Core V3 library is an implant that upgrades the firmware of the Embedded Netburner Module. " + "This upgraded firmware allows the Embedded Netburner Module to seamlessly inject code into " + "any device on a network.

" + @@ -658,7 +658,7 @@ function initAugmentations() { AddToAugmentations(ENMCoreV3); const ENMAnalyzeEngine = new Augmentation({ - name:AugmentationNames.ENMAnalyzeEngine, repCost:250e3, moneyCost:1200e6, + name:AugmentationNames.ENMAnalyzeEngine, repCost:6.25e5, moneyCost:6e9, info:"Installs the Analyze Engine for the Embedded Netburner Module, which is a CPU cluster " + "that vastly outperforms the Netburner Module's native single-core processor.

" + "This augmentation increases the player's hacking speed by 10%.", @@ -673,7 +673,7 @@ function initAugmentations() { AddToAugmentations(ENMAnalyzeEngine); const ENMDMA = new Augmentation({ - name:AugmentationNames.ENMDMA, repCost:400e3, moneyCost:1400e6, + name:AugmentationNames.ENMDMA, repCost:1e6, moneyCost:7e9, info:"This implant installs a Direct Memory Access (DMA) controller into the " + "Embedded Netburner Module. This allows the Module to send and receive data " + "directly to and from the main memory of devices on a network.

" + @@ -692,7 +692,7 @@ function initAugmentations() { AddToAugmentations(ENMDMA); const Neuralstimulator = new Augmentation({ - name:AugmentationNames.Neuralstimulator, repCost:20e3, moneyCost:600e6, + name:AugmentationNames.Neuralstimulator, repCost:5e4, moneyCost:3e9, info:"A cranial implant that intelligently stimulates certain areas of the brain " + "in order to improve cognitive functions.

" + "This augmentation:
" + @@ -712,7 +712,7 @@ function initAugmentations() { AddToAugmentations(Neuralstimulator); const NeuralAccelerator = new Augmentation({ - name:AugmentationNames.NeuralAccelerator, repCost:80e3, moneyCost:350e6, + name:AugmentationNames.NeuralAccelerator, repCost:2e5, moneyCost:1.75e9, info:"A microprocessor that accelerates the processing " + "speed of biological neural networks. This is a cranial implant that is embedded inside the brain.

" + "This augmentation:
" + @@ -730,7 +730,7 @@ function initAugmentations() { AddToAugmentations(NeuralAccelerator); const CranialSignalProcessorsG1 = new Augmentation({ - name:AugmentationNames.CranialSignalProcessorsG1, repCost:4e3, moneyCost:14e6, + name:AugmentationNames.CranialSignalProcessorsG1, repCost:1e4, moneyCost:7e7, info:"The first generation of Cranial Signal Processors. Cranial Signal Processors " + "are a set of specialized microprocessors that are attached to " + "neurons in the brain. These chips process neural signals to quickly and automatically perform specific computations " + @@ -748,7 +748,7 @@ function initAugmentations() { AddToAugmentations(CranialSignalProcessorsG1); const CranialSignalProcessorsG2 = new Augmentation({ - name:AugmentationNames.CranialSignalProcessorsG2, repCost:7500, moneyCost:25e6, + name:AugmentationNames.CranialSignalProcessorsG2, repCost:1.875e4, moneyCost:1.25e8, info:"The second generation of Cranial Signal Processors. Cranial Signal Processors " + "are a set of specialized microprocessors that are attached to " + "neurons in the brain. These chips process neural signals to quickly and automatically perform specific computations " + @@ -769,7 +769,7 @@ function initAugmentations() { AddToAugmentations(CranialSignalProcessorsG2); const CranialSignalProcessorsG3 = new Augmentation({ - name:AugmentationNames.CranialSignalProcessorsG3, repCost:20e3, moneyCost:110e6, + name:AugmentationNames.CranialSignalProcessorsG3, repCost:5e4, moneyCost:5.5e8, info:"The third generation of Cranial Signal Processors. Cranial Signal Processors " + "are a set of specialized microprocessors that are attached to " + "neurons in the brain. These chips process neural signals to quickly and automatically perform specific computations " + @@ -790,7 +790,7 @@ function initAugmentations() { AddToAugmentations(CranialSignalProcessorsG3); const CranialSignalProcessorsG4 = new Augmentation({ - name:AugmentationNames.CranialSignalProcessorsG4, repCost:50e3, moneyCost:220e6, + name:AugmentationNames.CranialSignalProcessorsG4, repCost:1.25e5, moneyCost:1.1e9, info:"The fourth generation of Cranial Signal Processors. Cranial Signal Processors " + "are a set of specialized microprocessors that are attached to " + "neurons in the brain. These chips process neural signals to quickly and automatically perform specific computations " + @@ -811,7 +811,7 @@ function initAugmentations() { AddToAugmentations(CranialSignalProcessorsG4); const CranialSignalProcessorsG5 = new Augmentation({ - name:AugmentationNames.CranialSignalProcessorsG5, repCost:100e3, moneyCost:450e6, + name:AugmentationNames.CranialSignalProcessorsG5, repCost:2.5e5, moneyCost:2.25e9, info:"The fifth generation of Cranial Signal Processors. Cranial Signal Processors " + "are a set of specialized microprocessors that are attached to " + "neurons in the brain. These chips process neural signals to quickly and automatically perform specific computations " + @@ -832,7 +832,7 @@ function initAugmentations() { AddToAugmentations(CranialSignalProcessorsG5); const NeuronalDensification = new Augmentation({ - name:AugmentationNames.NeuronalDensification, repCost:75e3, moneyCost:275e6, + name:AugmentationNames.NeuronalDensification, repCost:1.875e5, moneyCost:1.375e9, info:"The brain is surgically re-engineered to have increased neuronal density " + "by decreasing the neuron gap junction. Then, the body is genetically modified " + "to enhance the production and capabilities of its neural stem cells.

" + @@ -852,7 +852,7 @@ function initAugmentations() { // Work Augmentations const NuoptimalInjectorImplant = new Augmentation({ - name:AugmentationNames.NuoptimalInjectorImplant, repCost:2e3, moneyCost:4e6, + name:AugmentationNames.NuoptimalInjectorImplant, repCost:5e3, moneyCost:2e7, info:"This torso implant automatically injects nootropic supplements into " + "the bloodstream to improve memory, increase focus, and provide other " + "cognitive enhancements.

" + @@ -868,7 +868,7 @@ function initAugmentations() { AddToAugmentations(NuoptimalInjectorImplant); const SpeechEnhancement = new Augmentation({ - name:AugmentationNames.SpeechEnhancement, repCost:1e3, moneyCost:2.5e6, + name:AugmentationNames.SpeechEnhancement, repCost:2.5e3, moneyCost:1.25e7, info:"An advanced neural implant that improves your speaking abilities, making " + "you more convincing and likable in conversations and overall improving your " + "social interactions.

" + @@ -886,7 +886,7 @@ function initAugmentations() { AddToAugmentations(SpeechEnhancement); const FocusWire = new Augmentation({ - name:AugmentationNames.FocusWire, repCost:30e3, moneyCost:180e6, + name:AugmentationNames.FocusWire, repCost:7.5e4, moneyCost:9e8, info:"A cranial implant that stops procrastination by blocking specific neural pathways " + "in the brain.

" + "This augmentation:
" + @@ -909,7 +909,7 @@ function initAugmentations() { AddToAugmentations(FocusWire) const PCDNI = new Augmentation({ - name:AugmentationNames.PCDNI, repCost:150e3, moneyCost:750e6, + name:AugmentationNames.PCDNI, repCost:3.75e5, moneyCost:3.75e9, info:"Installs a Direct-Neural Interface jack into your arm that is compatible with most " + "computers. Connecting to a computer through this jack allows you to interface with " + "it using the brain's electrochemical signals.

" + @@ -926,7 +926,7 @@ function initAugmentations() { AddToAugmentations(PCDNI); const PCDNIOptimizer = new Augmentation({ - name:AugmentationNames.PCDNIOptimizer, repCost:200e3, moneyCost:900e6, + name:AugmentationNames.PCDNIOptimizer, repCost:5e5, moneyCost:4.5e9, info:"This is a submodule upgrade to the PC Direct-Neural Interface augmentation. It " + "improves the performance of the interface and gives the user more control options " + "to the connected computer.

" + @@ -944,7 +944,7 @@ function initAugmentations() { AddToAugmentations(PCDNIOptimizer); const PCDNINeuralNetwork = new Augmentation({ - name:AugmentationNames.PCDNINeuralNetwork, repCost:600e3, moneyCost:1500e6, + name:AugmentationNames.PCDNINeuralNetwork, repCost:1.5e6, moneyCost:7.5e9, info:"This is an additional installation that upgrades the functionality of the " + "PC Direct-Neural Interface augmentation. When connected to a computer, " + "The NeuroNet Injector upgrade allows the user to use his/her own brain's " + @@ -965,7 +965,7 @@ function initAugmentations() { AddToAugmentations(PCDNINeuralNetwork); const ADRPheromone1 = new Augmentation({ - name:AugmentationNames.ADRPheromone1, repCost:1500, moneyCost:3.5e6, + name:AugmentationNames.ADRPheromone1, repCost:3.75e3, moneyCost:1.75e7, info:"The body is genetically re-engineered so that it produces the ADR-V1 pheromone, " + "an artificial pheromone discovered by scientists. The ADR-V1 pheromone, when excreted, " + "triggers feelings of admiration and approval in other people.

" + @@ -980,7 +980,7 @@ function initAugmentations() { AddToAugmentations(ADRPheromone1); const ADRPheromone2 = new Augmentation({ - name:AugmentationNames.ADRPheromone2, repCost:25e3, moneyCost:110e6, + name:AugmentationNames.ADRPheromone2, repCost:6.25e4, moneyCost:5.5e8, info:"The body is genetically re-engineered so that it produces the ADR-V2 pheromone, " + "which is similar to but more potent than ADR-V1. This pheromone, when excreted, " + "triggers feelings of admiration, approval, and respect in others.

" + @@ -995,7 +995,7 @@ function initAugmentations() { AddToAugmentations(ADRPheromone2); const ShadowsSimulacrum = new Augmentation({ - name: AugmentationNames.ShadowsSimulacrum, repCost: 15e3, moneyCost: 80e6, + name: AugmentationNames.ShadowsSimulacrum, repCost:3.75e4, moneyCost:4e8, info: "A crude but functional matter phase-shifter module that is embedded " + "in the brainstem and cerebellum. This augmentation was developed by " + "criminal organizations and allows the user to project and control holographic " + @@ -1013,7 +1013,7 @@ function initAugmentations() { // HacknetNode Augmentations const HacknetNodeCPUUpload = new Augmentation({ - name:AugmentationNames.HacknetNodeCPUUpload, repCost:1500, moneyCost:2.2e6, + name:AugmentationNames.HacknetNodeCPUUpload, repCost:3.75e3, moneyCost:1.1e7, info:"Uploads the architecture and design details of a Hacknet Node's CPU into " + "the brain. This allows the user to engineer custom hardware and software " + "for the Hacknet Node that provides better performance.

" + @@ -1030,7 +1030,7 @@ function initAugmentations() { AddToAugmentations(HacknetNodeCPUUpload); const HacknetNodeCacheUpload = new Augmentation({ - name:AugmentationNames.HacknetNodeCacheUpload, repCost:1e3, moneyCost:1.1e6, + name:AugmentationNames.HacknetNodeCacheUpload, repCost:2.5e3, moneyCost:5.5e6, info:"Uploads the architecture and design details of a Hacknet Node's main-memory cache " + "into the brain. This allows the user to engineer custom cache hardware for the " + "Hacknet Node that offers better performance.

" + @@ -1047,7 +1047,7 @@ function initAugmentations() { AddToAugmentations(HacknetNodeCacheUpload); const HacknetNodeNICUpload = new Augmentation({ - name:AugmentationNames.HacknetNodeNICUpload, repCost:750, moneyCost:900e3, + name:AugmentationNames.HacknetNodeNICUpload, repCost:1.875e3, moneyCost:4.5e6, info:"Uploads the architecture and design details of a Hacknet Node's Network Interface Card (NIC) " + "into the brain. This allows the user to engineer a custom NIC for the Hacknet Node that " + "offers better performance.

" + @@ -1064,7 +1064,7 @@ function initAugmentations() { AddToAugmentations(HacknetNodeNICUpload); const HacknetNodeKernelDNI = new Augmentation({ - name:AugmentationNames.HacknetNodeKernelDNI, repCost:3e3, moneyCost:8e6, + name:AugmentationNames.HacknetNodeKernelDNI, repCost:7.5e3, moneyCost:4e7, info:"Installs a Direct-Neural Interface jack into the arm that is capable of connecting to a " + "Hacknet Node. This lets the user access and manipulate the Node's kernel using the mind's " + "electrochemical signals.

" + @@ -1078,7 +1078,7 @@ function initAugmentations() { AddToAugmentations(HacknetNodeKernelDNI); const HacknetNodeCoreDNI = new Augmentation({ - name:AugmentationNames.HacknetNodeCoreDNI, repCost:5e3, moneyCost:12e6, + name:AugmentationNames.HacknetNodeCoreDNI, repCost:1.25e4, moneyCost:6e7, info:"Installs a Direct-Neural Interface jack into the arm that is capable of connecting " + "to a Hacknet Node. This lets the user access and manipulate the Node's processing logic using " + "the mind's electrochemical signals.

" + @@ -1093,7 +1093,7 @@ function initAugmentations() { //Misc/Hybrid augmentations const NeuroFluxGovernor = new Augmentation({ - name:AugmentationNames.NeuroFluxGovernor, repCost:500, moneyCost: 750e3, + name:AugmentationNames.NeuroFluxGovernor, repCost:1.25e3, moneyCost:3.75e6, info:"A device that is embedded in the back of the neck. The NeuroFlux Governor " + "monitors and regulates nervous impulses coming to and from the spinal column, " + "essentially 'governing' the body. By doing so, it improves the functionality of the " + @@ -1146,8 +1146,8 @@ function initAugmentations() { } } let mult = Math.pow(CONSTANTS.NeuroFluxGovernorLevelMult, nextLevel); - NeuroFluxGovernor.baseRepRequirement = 500 * mult * CONSTANTS.AugmentationRepMultiplier * BitNodeMultipliers.AugmentationRepCost; - NeuroFluxGovernor.baseCost = 750e3 * mult * CONSTANTS.AugmentationCostMultiplier * BitNodeMultipliers.AugmentationMoneyCost; + NeuroFluxGovernor.baseRepRequirement = 500 * mult * BitNodeMultipliers.AugmentationRepCost; + NeuroFluxGovernor.baseCost = 750e3 * mult * BitNodeMultipliers.AugmentationMoneyCost; if (augmentationExists(AugmentationNames.NeuroFluxGovernor)) { delete Augmentations[AugmentationNames.NeuroFluxGovernor]; } @@ -1155,7 +1155,7 @@ function initAugmentations() { AddToAugmentations(NeuroFluxGovernor); const Neurotrainer1 = new Augmentation({ - name:AugmentationNames.Neurotrainer1, repCost:400, moneyCost:800e3, + name:AugmentationNames.Neurotrainer1, repCost:1e3, moneyCost:4e6, info:"A decentralized cranial implant that improves the brain's ability to learn. It is " + "installed by releasing millions of nanobots into the human brain, each of which " + "attaches to a different neural pathway to enhance the brain's ability to retain " + @@ -1175,7 +1175,7 @@ function initAugmentations() { AddToAugmentations(Neurotrainer1); const Neurotrainer2 = new Augmentation({ - name:AugmentationNames.Neurotrainer2, repCost:4e3, moneyCost:9e6, + name:AugmentationNames.Neurotrainer2, repCost:1e4, moneyCost:4.5e7, info:"A decentralized cranial implant that improves the brain's ability to learn. This " + "is a more powerful version of the Neurotrainer I augmentation, but it does not " + "require Neurotrainer I to be installed as a prerequisite.

" + @@ -1194,7 +1194,7 @@ function initAugmentations() { AddToAugmentations(Neurotrainer2); const Neurotrainer3 = new Augmentation({ - name:AugmentationNames.Neurotrainer3, repCost:10e3, moneyCost:26e6, + name:AugmentationNames.Neurotrainer3, repCost:2.5e4, moneyCost:1.3e8, info:"A decentralized cranial implant that improves the brain's ability to learn. This " + "is a more powerful version of the Neurotrainer I and Neurotrainer II augmentation, " + "but it does not require either of them to be installed as a prerequisite.

" + @@ -1213,7 +1213,7 @@ function initAugmentations() { AddToAugmentations(Neurotrainer3); const Hypersight = new Augmentation({ - name:AugmentationNames.Hypersight, repCost:60e3, moneyCost:550e6, + name:AugmentationNames.Hypersight, repCost:1.5e5, moneyCost:2.75e9, info:"A bionic eye implant that grants sight capabilities far beyond those of a natural human. " + "Embedded circuitry within the implant provides the ability to detect heat and movement " + "through solid objects such as wells, thus providing 'x-ray vision'-like capabilities.

" + @@ -1232,7 +1232,7 @@ function initAugmentations() { AddToAugmentations(Hypersight); const LuminCloaking1 = new Augmentation({ - name:AugmentationNames.LuminCloaking1, repCost:600, moneyCost:1e6, + name:AugmentationNames.LuminCloaking1, repCost:1.5e3, moneyCost:5e6, info:"A skin implant that reinforces the skin with highly-advanced synthetic cells. These " + "cells, when powered, have a negative refractive index. As a result, they bend light " + "around the skin, making the user much harder to see from the naked eye.

" + @@ -1249,7 +1249,7 @@ function initAugmentations() { AddToAugmentations(LuminCloaking1); const LuminCloaking2 = new Augmentation({ - name:AugmentationNames.LuminCloaking2, repCost:2e3, moneyCost:6e6, + name:AugmentationNames.LuminCloaking2, repCost:5e3, moneyCost:3e7, info:"This is a more advanced version of the LuminCloaking-V2 augmentation. This skin implant " + "reinforces the skin with highly-advanced synthetic cells. These " + "cells, when powered, are capable of not only bending light but also of bending heat, " + @@ -1270,7 +1270,7 @@ function initAugmentations() { AddToAugmentations(LuminCloaking2); const SmartSonar = new Augmentation({ - name:AugmentationNames.SmartSonar, repCost:9e3, moneyCost:15e6, + name:AugmentationNames.SmartSonar, repCost:2.25e4, moneyCost:7.5e7, info:"A cochlear implant that helps the player detect and locate enemies " + "using sound propagation.

" + "This augmentation:
" + @@ -1288,7 +1288,7 @@ function initAugmentations() { AddToAugmentations(SmartSonar); const PowerRecirculator = new Augmentation({ - name:AugmentationNames.PowerRecirculator, repCost:10e3, moneyCost:36e6, + name:AugmentationNames.PowerRecirculator, repCost:2.5e4, moneyCost:1.8e8, info:"The body's nerves are attached with polypyrrole nanocircuits that " + "are capable of capturing wasted energy (in the form of heat) " + "and converting it back into usable power.

" + @@ -1321,7 +1321,7 @@ function initAugmentations() { // Illuminati const QLink = new Augmentation({ - name:AugmentationNames.QLink, repCost:750e3, moneyCost:5e12, + name:AugmentationNames.QLink, repCost:1.875e6, moneyCost:2.5e13, info:"A brain implant that wirelessly connects you to the Illuminati's " + "quantum supercomputer, allowing you to access and use its incredible " + "computing power.

" + @@ -1343,7 +1343,7 @@ function initAugmentations() { // Daedalus const RedPill = new Augmentation({ - name:AugmentationNames.TheRedPill, repCost:1e6, moneyCost:0, + name:AugmentationNames.TheRedPill, repCost:2.5e6, moneyCost:0e0, info:"It's time to leave the cave.", }); RedPill.addToFactions(["Daedalus"]); @@ -1354,7 +1354,7 @@ function initAugmentations() { // Covenant const SPTN97 = new Augmentation({ - name:AugmentationNames.SPTN97, repCost:500e3, moneyCost:975e6, + name:AugmentationNames.SPTN97, repCost:1.25e6, moneyCost:4.875e9, info:"The SPTN-97 gene is injected into the genome. The SPTN-97 gene is an " + "artificially-synthesized gene that was developed by DARPA to create " + "super-soldiers through genetic modification. The gene was outlawed in " + @@ -1376,7 +1376,7 @@ function initAugmentations() { // ECorp const HiveMind = new Augmentation({ - name:AugmentationNames.HiveMind, repCost:600e3, moneyCost:1100e6, + name:AugmentationNames.HiveMind, repCost:1.5e6, moneyCost:5.5e9, info:"A brain implant developed by ECorp. They do not reveal what " + "exactly the implant does, but they promise that it will greatly " + "enhance your abilities.", @@ -1390,7 +1390,7 @@ function initAugmentations() { // MegaCorp const CordiARCReactor = new Augmentation({ - name:AugmentationNames.CordiARCReactor, repCost:450e3, moneyCost:1000e6, + name:AugmentationNames.CordiARCReactor, repCost:1.125e6, moneyCost:5e9, info:"The thoracic cavity is equipped with a small chamber designed " + "to hold and sustain hydrogen plasma. The plasma is used to generate " + "fusion power through nuclear fusion, providing limitless amount of clean " + @@ -1415,7 +1415,7 @@ function initAugmentations() { // BachmanAndAssociates const SmartJaw = new Augmentation({ - name:AugmentationNames.SmartJaw, repCost:150e3, moneyCost:550e6, + name:AugmentationNames.SmartJaw, repCost:3.75e5, moneyCost:2.75e9, info:"A bionic jaw that contains advanced hardware and software " + "capable of psychoanalyzing and profiling the personality of " + "others using optical imaging software.

" + @@ -1437,7 +1437,7 @@ function initAugmentations() { // BladeIndustries const Neotra = new Augmentation({ - name:AugmentationNames.Neotra, repCost:225e3, moneyCost:575e6, + name:AugmentationNames.Neotra, repCost:5.625e5, moneyCost:2.875e9, info:"A highly-advanced techno-organic drug that is injected into the skeletal " + "and integumentary system. The drug permanently modifies the DNA of the " + "body's skin and bone cells, granting them the ability to repair " + @@ -1454,7 +1454,7 @@ function initAugmentations() { // NWO const Xanipher = new Augmentation({ - name:AugmentationNames.Xanipher, repCost:350e3, moneyCost:850e6, + name:AugmentationNames.Xanipher, repCost:8.75e5, moneyCost:4.25e9, info:"A concoction of advanced nanobots that is orally ingested into the " + "body. These nanobots induce physiological change and significantly " + "improve the body's functioning in all aspects.

" + @@ -1481,7 +1481,7 @@ function initAugmentations() { AddToAugmentations(Xanipher); const HydroflameLeftArm = new Augmentation({ - name:AugmentationNames.HydroflameLeftArm, repCost:500e3, moneyCost:500e9, + name:AugmentationNames.HydroflameLeftArm, repCost:1.25e6, moneyCost:2.5e12, info:"The left arm of a legendary BitRunner who ascended beyond this world. " + "It projects a light blue energy shield that protects the exposed inner parts. " + "Even though it contains no weapons, the advance tungsten titanium " + @@ -1500,7 +1500,7 @@ function initAugmentations() { // ClarkeIncorporated const nextSENS = new Augmentation({ - name:AugmentationNames.nextSENS, repCost:175e3, moneyCost:385e6, + name:AugmentationNames.nextSENS, repCost:4.375e5, moneyCost:1.925e9, info:"The body is genetically re-engineered to maintain a state " + "of negligible senescence, preventing the body from " + "deteriorating with age.

" + @@ -1520,7 +1520,7 @@ function initAugmentations() { // OmniTekIncorporated const OmniTekInfoLoad = new Augmentation({ - name:AugmentationNames.OmniTekInfoLoad, repCost:250e3, moneyCost:575e6, + name:AugmentationNames.OmniTekInfoLoad, repCost:6.25e5, moneyCost:2.875e9, info:"OmniTek's data and information repository is uploaded " + "into your brain, enhancing your programming and " + "hacking abilities.

" + @@ -1541,7 +1541,7 @@ function initAugmentations() { // KuaiGongInternational const PhotosyntheticCells = new Augmentation({ - name:AugmentationNames.PhotosyntheticCells, repCost:225e3, moneyCost:550e6, + name:AugmentationNames.PhotosyntheticCells, repCost:5.625e5, moneyCost:2.75e9, info:"Chloroplasts are added to epidermal stem cells and are applied " + "to the body using a skin graft. The result is photosynthetic " + "skin cells, allowing users to generate their own energy " + @@ -1559,7 +1559,7 @@ function initAugmentations() { // BitRunners const Neurolink = new Augmentation({ - name:AugmentationNames.Neurolink, repCost:350e3, moneyCost:875e6, + name:AugmentationNames.Neurolink, repCost:8.75e5, moneyCost:4.375e9, info:"A brain implant that provides a high-bandwidth, direct neural link between your " + "mind and BitRunners' data servers, which reportedly contain " + "the largest database of hacking tools and information in the world.

" + @@ -1582,7 +1582,7 @@ function initAugmentations() { // BlackHand const TheBlackHand = new Augmentation({ - name:AugmentationNames.TheBlackHand, repCost:40e3, moneyCost:110e6, + name:AugmentationNames.TheBlackHand, repCost:1e5, moneyCost:5.5e8, info:"A highly advanced bionic hand. This prosthetic not only " + "enhances strength and dexterity but it is also embedded " + "with hardware and firmware that lets the user connect to, access and hack " + @@ -1606,7 +1606,7 @@ function initAugmentations() { // NiteSec const CRTX42AA = new Augmentation({ - name:AugmentationNames.CRTX42AA, repCost:18e3, moneyCost:45e6, + name:AugmentationNames.CRTX42AA, repCost:4.5e4, moneyCost:2.25e8, info:"The CRTX42-AA gene is injected into the genome. " + "The CRTX42-AA is an artificially-synthesized gene that targets the visual and prefrontal " + "cortex and improves cognitive abilities.

" + @@ -1624,7 +1624,7 @@ function initAugmentations() { // Chongqing const Neuregen = new Augmentation({ - name:AugmentationNames.Neuregen, repCost:15e3, moneyCost:75e6, + name:AugmentationNames.Neuregen, repCost:3.75e4, moneyCost:3.75e8, info:"A drug that genetically modifies the neurons in the brain. " + "The result is that these neurons never die and continuously " + "regenerate and strengthen themselves.

" + @@ -1639,7 +1639,7 @@ function initAugmentations() { // Sector12 const CashRoot = new Augmentation({ - name:AugmentationNames.CashRoot, repCost:5e3, moneyCost:25e6, + name:AugmentationNames.CashRoot, repCost:1.25e4, moneyCost:1.25e8, info:<>A collection of digital assets saved on a small chip. The chip is implanted into your wrist. A small jack in the chip allows you to connect it to a computer and upload the assets.

@@ -1655,7 +1655,7 @@ function initAugmentations() { // NewTokyo const NutriGen = new Augmentation({ - name:AugmentationNames.NutriGen, repCost:2500, moneyCost:500e3, + name:AugmentationNames.NutriGen, repCost:6.25e3, moneyCost:2.5e6, info:"A thermo-powered artificial nutrition generator. Endogenously " + "synthesizes glucose, amino acids, and vitamins and redistributes them " + "across the body. The device is powered by the body's naturally wasted " + @@ -1678,7 +1678,7 @@ function initAugmentations() { // Ishima const INFRARet = new Augmentation({ - name:AugmentationNames.INFRARet, repCost:3e3, moneyCost:6e6, + name:AugmentationNames.INFRARet, repCost:7.5e3, moneyCost:3e7, info:"A retina implant consisting of a tiny chip that sits behind the " + "retina. This implant lets people visually detect infrared radiation.

" + "This augmentation:
" + @@ -1697,7 +1697,7 @@ function initAugmentations() { // Volhaven const DermaForce = new Augmentation({ - name:AugmentationNames.DermaForce, repCost:6e3, moneyCost:10e6, + name:AugmentationNames.DermaForce, repCost:1.5e4, moneyCost:5e7, info:"A synthetic skin is grafted onto the body. The skin consists of " + "millions of nanobots capable of projecting high-density muon beams, " + "creating an energy barrier around the user.

" + @@ -1712,7 +1712,7 @@ function initAugmentations() { // SpeakersForTheDead const GrapheneBrachiBlades = new Augmentation({ - name:AugmentationNames.GrapheneBrachiBlades, repCost:90e3, moneyCost:500e6, + name:AugmentationNames.GrapheneBrachiBlades, repCost:2.25e5, moneyCost:2.5e9, info:"An upgrade to the BrachiBlades augmentation. It infuses " + "the retractable blades with an advanced graphene material " + "to make them much stronger and lighter.

" + @@ -1734,7 +1734,7 @@ function initAugmentations() { // DarkArmy const GrapheneBionicArms = new Augmentation({ - name:AugmentationNames.GrapheneBionicArms, repCost:200e3, moneyCost:750e6, + name:AugmentationNames.GrapheneBionicArms, repCost:5e5, moneyCost:3.75e9, info:"An upgrade to the Bionic Arms augmentation. It infuses the " + "prosthetic arms with an advanced graphene material " + "to make them much stronger and lighter.

" + @@ -1751,7 +1751,7 @@ function initAugmentations() { // TheSyndicate const BrachiBlades = new Augmentation({ - name:AugmentationNames.BrachiBlades, repCost:5e3, moneyCost:18e6, + name:AugmentationNames.BrachiBlades, repCost:1.25e4, moneyCost:9e7, info:"A set of retractable plasteel blades are implanted in the arm, underneath the skin.

" + "This augmentation:
" + "Increases the player's strength and defense by 15%.
" + @@ -1770,7 +1770,7 @@ function initAugmentations() { // Tetrads const BionicArms = new Augmentation({ - name:AugmentationNames.BionicArms, repCost:25e3, moneyCost:55e6, + name:AugmentationNames.BionicArms, repCost:6.25e4, moneyCost:2.75e8, info:"Cybernetic arms created from plasteel and carbon fibers that completely replace " + "the user's organic arms.

" + "This augmentation increases the user's strength and dexterity by 30%.", @@ -1785,7 +1785,7 @@ function initAugmentations() { // TianDiHui const SNA = new Augmentation({ - name:AugmentationNames.SNA, repCost:2500, moneyCost:6e6, + name:AugmentationNames.SNA, repCost:6.25e3, moneyCost:3e7, info:"A cranial implant that affects the user's personality, making them better " + "at negotiation in social situations.

" + "This augmentation:
" + @@ -1806,7 +1806,7 @@ function initAugmentations() { const BladeburnersFactionName = "Bladeburners"; if (factionExists(BladeburnersFactionName)) { const EsperEyewear = new Augmentation({ - name:AugmentationNames.EsperEyewear, repCost:500, moneyCost:33e6, + name:AugmentationNames.EsperEyewear, repCost:1.25e3, moneyCost:1.65e8, info:"Ballistic-grade protective and retractable eyewear that was designed specially " + "for Bladeburner units. This " + "is implanted by installing a mechanical frame in the skull's orbit. " + @@ -1826,7 +1826,7 @@ function initAugmentations() { resetAugmentation(EsperEyewear); const EMS4Recombination = new Augmentation({ - name:AugmentationNames.EMS4Recombination, repCost: 1e3, moneyCost:55e6, + name:AugmentationNames.EMS4Recombination, repCost:2.5e3, moneyCost:2.75e8, info:"A DNA recombination of the EMS-4 Gene. This genetic engineering " + "technique was originally used on Bladeburners during the Synthoid uprising " + "to induce wakefulness and concentration, suppress fear, reduce empathy, and " + @@ -1844,7 +1844,7 @@ function initAugmentations() { resetAugmentation(EMS4Recombination); const OrionShoulder = new Augmentation({ - name:AugmentationNames.OrionShoulder, repCost:2.5e3, moneyCost:110e6, + name:AugmentationNames.OrionShoulder, repCost:6.25e3, moneyCost:5.5e8, info:"A bionic shoulder augmentation for the right shoulder. Using cybernetics, " + "the ORION-MKIV shoulder enhances the strength and dexterity " + "of the user's right arm. It also provides protection due to its " + @@ -1863,7 +1863,7 @@ function initAugmentations() { resetAugmentation(OrionShoulder); const HyperionV1 = new Augmentation({ - name:AugmentationNames.HyperionV1, repCost: 5e3, moneyCost:550e6, + name:AugmentationNames.HyperionV1, repCost:1.25e4, moneyCost:2.75e9, info:"A pair of mini plasma cannons embedded into the hands. The Hyperion is capable " + "of rapidly firing bolts of high-density plasma. The weapon is meant to " + "be used against augmented enemies as the ionized " + @@ -1878,7 +1878,7 @@ function initAugmentations() { resetAugmentation(HyperionV1); const HyperionV2 = new Augmentation({ - name:AugmentationNames.HyperionV2, repCost:10e3, moneyCost:1.1e9, + name:AugmentationNames.HyperionV2, repCost:2.5e4, moneyCost:5.5e9, info:"A pair of mini plasma cannons embedded into the hands. This augmentation " + "is more advanced and powerful than the original V1 model. This V2 model is " + "more power-efficiency, more accurate, and can fire plasma bolts at a much " + @@ -1892,7 +1892,7 @@ function initAugmentations() { resetAugmentation(HyperionV2); const GolemSerum = new Augmentation({ - name:AugmentationNames.GolemSerum, repCost:12.5e3, moneyCost:2.2e9, + name:AugmentationNames.GolemSerum, repCost:3.125e4, moneyCost:1.1e10, info:"A serum that permanently enhances many aspects of a human's capabilities, " + "including strength, speed, immune system performance, and mitochondrial efficiency. The " + "serum was originally developed by the Chinese military in an attempt to " + @@ -1911,7 +1911,7 @@ function initAugmentations() { resetAugmentation(GolemSerum); const VangelisVirus = new Augmentation({ - name:AugmentationNames.VangelisVirus, repCost:7.5e3, moneyCost:550e6, + name:AugmentationNames.VangelisVirus, repCost:1.875e4, moneyCost:2.75e9, info:"A synthetic symbiotic virus that is injected into the human brain tissue. The Vangelis virus " + "heightens the senses and focus of its host, and also enhances its intuition.

" + "This augmentation:
" + @@ -1927,7 +1927,7 @@ function initAugmentations() { resetAugmentation(VangelisVirus); const VangelisVirus3 = new Augmentation({ - name:AugmentationNames.VangelisVirus3, repCost:15e3, moneyCost:2.2e9, + name:AugmentationNames.VangelisVirus3, repCost:3.75e4, moneyCost:1.1e10, info:"An improved version of Vangelis, a synthetic symbiotic virus that is " + "injected into the human brain tissue. On top of the benefits of the original " + "virus, this also grants an accelerated healing factor and enhanced " + @@ -1947,7 +1947,7 @@ function initAugmentations() { resetAugmentation(VangelisVirus3); const INTERLINKED = new Augmentation({ - name:AugmentationNames.INTERLINKED, repCost:10e3, moneyCost:1.1e9, + name:AugmentationNames.INTERLINKED, repCost:2.5e4, moneyCost:5.5e9, info:"The DNA is genetically modified to enhance the human's body " + "extracellular matrix (ECM). This improves the ECM's ability to " + "structurally support the body and grants heightened strength and " + @@ -1966,7 +1966,7 @@ function initAugmentations() { resetAugmentation(INTERLINKED); const BladeRunner = new Augmentation({ - name:AugmentationNames.BladeRunner, repCost:8e3, moneyCost:1.65e9, + name:AugmentationNames.BladeRunner, repCost:2e4, moneyCost:8.25e9, info:"A cybernetic foot augmentation that was specially created for Bladeburners " + "during the Synthoid Uprising. The organic musculature of the human foot " + "is enhanced with flexible carbon nanotube matrices that are controlled by " + @@ -1984,7 +1984,7 @@ function initAugmentations() { resetAugmentation(BladeRunner); const BladeArmor = new Augmentation({ - name:AugmentationNames.BladeArmor, repCost:5e3, moneyCost:275e6, + name:AugmentationNames.BladeArmor, repCost:1.25e4, moneyCost:1.375e9, info:"A powered exoskeleton suit (exosuit) designed as armor for Bladeburner units. This " + "exoskeleton is incredibly adaptable and can protect the wearer from blunt, piercing, " + "concussive, thermal, chemical, and electric trauma. It also enhances the user's " + @@ -2005,7 +2005,7 @@ function initAugmentations() { resetAugmentation(BladeArmor); const BladeArmorPowerCells = new Augmentation({ - name:AugmentationNames.BladeArmorPowerCells, repCost:7.5e3, moneyCost:550e6, + name:AugmentationNames.BladeArmorPowerCells, repCost:1.875e4, moneyCost:2.75e9, info:"Upgrades the BLADE-51b Tesla Armor with Ion Power Cells, which are capable of " + "more efficiently storing and using power.

" + "This augmentation:
" + @@ -2022,7 +2022,7 @@ function initAugmentations() { resetAugmentation(BladeArmorPowerCells); const BladeArmorEnergyShielding = new Augmentation({ - name:AugmentationNames.BladeArmorEnergyShielding, repCost:8.5e3, moneyCost:1.1e9, + name:AugmentationNames.BladeArmorEnergyShielding, repCost:2.125e4, moneyCost:5.5e9, info:"Upgrades the BLADE-51b Tesla Armor with a plasma energy propulsion system " + "that is capable of projecting an energy shielding force field.

" + "This augmentation:
" + @@ -2037,7 +2037,7 @@ function initAugmentations() { resetAugmentation(BladeArmorEnergyShielding); const BladeArmorUnibeam = new Augmentation({ - name:AugmentationNames.BladeArmorUnibeam, repCost:12.5e3, moneyCost:3.3e9, + name:AugmentationNames.BladeArmorUnibeam, repCost:3.125e4, moneyCost:1.65e10, info:"Upgrades the BLADE-51b Tesla Armor with a concentrated deuterium-fluoride laser " + "weapon. It's precision an accuracy makes it useful for quickly neutralizing " + "threats while keeping casualties to a minimum.

" + @@ -2050,7 +2050,7 @@ function initAugmentations() { resetAugmentation(BladeArmorUnibeam); const BladeArmorOmnibeam = new Augmentation({ - name:AugmentationNames.BladeArmorOmnibeam, repCost:25e3, moneyCost:5.5e9, + name:AugmentationNames.BladeArmorOmnibeam, repCost:6.25e4, moneyCost:2.75e10, info:"Upgrades the BLADE-51b Tesla Armor Unibeam augmentation to use " + "multiple-fiber system. The upgraded weapon uses multiple fiber laser " + "modules that combine together to form a single, more powerful beam of up to " + @@ -2064,7 +2064,7 @@ function initAugmentations() { resetAugmentation(BladeArmorOmnibeam); const BladeArmorIPU = new Augmentation({ - name:AugmentationNames.BladeArmorIPU, repCost: 6e3, moneyCost:220e6, + name:AugmentationNames.BladeArmorIPU, repCost:1.5e4, moneyCost:1.1e9, info:"Upgrades the BLADE-51b Tesla Armor with an AI Information Processing " + "Unit that was specially designed to analyze Synthoid related data and " + "information.

" + @@ -2080,7 +2080,7 @@ function initAugmentations() { resetAugmentation(BladeArmorIPU); const BladesSimulacrum = new Augmentation({ - name:AugmentationNames.BladesSimulacrum, repCost: 500, moneyCost: 30e9, + name:AugmentationNames.BladesSimulacrum, repCost:1.25e3, moneyCost:1.5e11, info:"A highly-advanced matter phase-shifter module that is embedded " + "in the brainstem and cerebellum. This augmentation allows " + "the user to project and control a holographic simulacrum within an " + diff --git a/src/Constants.ts b/src/Constants.ts index cd423263e..99dd7a93e 100644 --- a/src/Constants.ts +++ b/src/Constants.ts @@ -51,8 +51,6 @@ export const CONSTANTS: IMap = { PurchasedServerMaxRam: 1048576, // 2^20 // Augmentation Constants - AugmentationCostMultiplier: 5, // Used for balancing costs without having to readjust every Augmentation cost - AugmentationRepMultiplier: 2.5, // Used for balancing rep cost without having to readjust every value MultipleAugMultiplier: 1.9, // TOR Router diff --git a/src/Faction/FactionHelpers.jsx b/src/Faction/FactionHelpers.jsx index b679ee076..eb4b4966b 100644 --- a/src/Faction/FactionHelpers.jsx +++ b/src/Faction/FactionHelpers.jsx @@ -190,8 +190,8 @@ export function purchaseAugmentation(aug, fac, sing=false) { var nextLevel = getNextNeurofluxLevel(); --nextLevel; var mult = Math.pow(CONSTANTS.NeuroFluxGovernorLevelMult, nextLevel); - aug.baseRepRequirement = 500 * mult * CONSTANTS.AugmentationRepMultiplier * BitNodeMultipliers.AugmentationRepCost; - aug.baseCost = 750e3 * mult * CONSTANTS.AugmentationCostMultiplier * BitNodeMultipliers.AugmentationMoneyCost; + aug.baseRepRequirement = 500 * mult * BitNodeMultipliers.AugmentationRepCost; + aug.baseCost = 750e3 * mult * BitNodeMultipliers.AugmentationMoneyCost; for (var i = 0; i < Player.queuedAugmentations.length-1; ++i) { aug.baseCost *= CONSTANTS.MultipleAugMultiplier; From 61dded637d049de8b50fa85857848970b0fa1d02 Mon Sep 17 00:00:00 2001 From: Olivier Gagnon Date: Sun, 6 Jun 2021 14:40:16 -0400 Subject: [PATCH 30/32] fix some typos in augmentation descriptions. --- src/Augmentation/AugmentationHelpers.jsx | 100 +++++++++++------------ 1 file changed, 50 insertions(+), 50 deletions(-) diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index e9951f328..c15a3120e 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -300,7 +300,7 @@ function initAugmentations() { "The material is implanted underneath the skin, and is the most advanced form of defensive enhancement " + "that has ever been created. The dilatant fluid, despite being thin and light, is extremely effective " + "at stopping piercing blows and reducing blunt trauma. The properties of graphene allow the plating to " + - "mitigate damage from any fire-related or electrical traumas.

" + + "mitigate damage from any fire or electrical traumas.

" + "This augmentation increases the player's defense by 120%.", defense_mult: 2.2, }); @@ -437,8 +437,8 @@ function initAugmentations() { const EnhancedSocialInteractionImplant = new Augmentation({ name:AugmentationNames.EnhancedSocialInteractionImplant, repCost:3.75e5, moneyCost:1.375e9, info:"A cranial implant that greatly assists in the user's ability to analyze social situations " + - "and interactions. The system uses a wide variety of factors such as facial expression, body " + - "language, and the voice's tone/inflection to determine the best course of action during social" + + "and interactions. The system uses a wide variety of factors such as facial expressions, body " + + "language, and the voice tone, and inflection to determine the best course of action during social" + "situations. The implant also uses deep learning software to continuously learn new behavior" + "patterns and how to best respond.

" + "This augmentation increases the player's charisma and charisma experience gain rate by 60%.", @@ -469,10 +469,10 @@ function initAugmentations() { const ArtificialBioNeuralNetwork = new Augmentation({ name:AugmentationNames.ArtificialBioNeuralNetwork, repCost:2.75e5, moneyCost:3e9, info:"A network consisting of millions of nanoprocessors is embedded into the brain. " + - "The network is meant to mimick the way a biological brain solves a problem, which each " + + "The network is meant to mimic the way a biological brain solves a problem, with each " + "nanoprocessor acting similar to the way a neuron would in a neural network. However, these " + "nanoprocessors are programmed to perform computations much faster than organic neurons, " + - "allowing its user to solve much more complex problems at a much faster rate.

" + + "allowing the user to solve much more complex problems at a much faster rate.

" + "This augmentation:
" + "Increases the player's hacking speed by 3%.
" + "Increases the amount of money the player's gains from hacking by 15%.
" + @@ -507,7 +507,7 @@ function initAugmentations() { const EnhancedMyelinSheathing = new Augmentation({ name:AugmentationNames.EnhancedMyelinSheathing, repCost:1e5, moneyCost:1.375e9, - info:"Electrical signals are used to induce a new, artificial form of myelinogensis in the human body. " + + info:"Electrical signals are used to induce a new, artificial form of myelinogenesis in the human body. " + "This process results in the proliferation of new, synthetic myelin sheaths in the nervous " + "system. These myelin sheaths can propogate neuro-signals much faster than their organic " + "counterparts, leading to greater processing speeds and better brain function.

" + @@ -527,7 +527,7 @@ function initAugmentations() { const SynapticEnhancement = new Augmentation({ name:AugmentationNames.SynapticEnhancement, repCost:2e3, moneyCost:7.5e6, - info:"A small cranial implant that continuously uses weak electric signals to stimulate the brain and " + + info:"A small cranial implant that continuously uses weak electrical signals to stimulate the brain and " + "induce stronger synaptic activity. This improves the user's cognitive abilities.

" + "This augmentation increases the player's hacking speed by 3%.", hacking_speed_mult: 1.03, @@ -541,7 +541,7 @@ function initAugmentations() { const NeuralRetentionEnhancement = new Augmentation({ name:AugmentationNames.NeuralRetentionEnhancement, repCost:2e4, moneyCost:2.5e8, info:"Chemical injections are used to permanently alter and strengthen the brain's neuronal " + - "circuits, strengthening its ability to retain information.

" + + "circuits, strengthening the ability to retain information.

" + "This augmentation increases the player's hacking experience gain rate by 25%.", hacking_exp_mult: 1.25, }); @@ -609,8 +609,8 @@ function initAugmentations() { const ENMCoreV2 = new Augmentation({ name:AugmentationNames.ENMCoreV2, repCost:1e6, moneyCost:4.5e9, info:"The Core V2 library is an implant that upgrades the firmware of the Embedded Netburner Module. " + - "This upgraded firmware allows the Embedded Netburner Module to control the information on " + - "a network by re-routing traffic, spoofing IP addresses, or altering the data inside network " + + "This upgraded firmware allows the Embedded Netburner Module to control information on " + + "a network by re-routing traffic, spoofing IP addresses, and altering the data inside network " + "packets.

" + "This augmentation:
" + "Increases the player's hacking speed by 5%.
" + @@ -929,7 +929,7 @@ function initAugmentations() { name:AugmentationNames.PCDNIOptimizer, repCost:5e5, moneyCost:4.5e9, info:"This is a submodule upgrade to the PC Direct-Neural Interface augmentation. It " + "improves the performance of the interface and gives the user more control options " + - "to the connected computer.

" + + "to a connected computer.

" + "This augmentation:
" + "Increases the amount of reputation the player gains when working for a company by 75%.
" + "Increases the player's hacking skill by 10%.", @@ -947,7 +947,7 @@ function initAugmentations() { name:AugmentationNames.PCDNINeuralNetwork, repCost:1.5e6, moneyCost:7.5e9, info:"This is an additional installation that upgrades the functionality of the " + "PC Direct-Neural Interface augmentation. When connected to a computer, " + - "The NeuroNet Injector upgrade allows the user to use his/her own brain's " + + "The Neural Network upgrade allows the user to use their own brain's " + "processing power to aid the computer in computational tasks.

" + "This augmentation:
" + "Increases the amount of reputation the player gains when working for a company by 100%.
" + @@ -1066,7 +1066,7 @@ function initAugmentations() { const HacknetNodeKernelDNI = new Augmentation({ name:AugmentationNames.HacknetNodeKernelDNI, repCost:7.5e3, moneyCost:4e7, info:"Installs a Direct-Neural Interface jack into the arm that is capable of connecting to a " + - "Hacknet Node. This lets the user access and manipulate the Node's kernel using the mind's " + + "Hacknet Node. This lets the user access and manipulate the Node's kernel using " + "electrochemical signals.

" + "This augmentation increases the amount of money produced by Hacknet Nodes by 25%.", hacknet_node_money_mult: 1.25, @@ -1081,7 +1081,7 @@ function initAugmentations() { name:AugmentationNames.HacknetNodeCoreDNI, repCost:1.25e4, moneyCost:6e7, info:"Installs a Direct-Neural Interface jack into the arm that is capable of connecting " + "to a Hacknet Node. This lets the user access and manipulate the Node's processing logic using " + - "the mind's electrochemical signals.

" + + "electrochemical signals.

" + "This augmentation increases the amount of money produced by Hacknet Nodes by 45%.", hacknet_node_money_mult: 1.45, }); @@ -1216,7 +1216,7 @@ function initAugmentations() { name:AugmentationNames.Hypersight, repCost:1.5e5, moneyCost:2.75e9, info:"A bionic eye implant that grants sight capabilities far beyond those of a natural human. " + "Embedded circuitry within the implant provides the ability to detect heat and movement " + - "through solid objects such as wells, thus providing 'x-ray vision'-like capabilities.

" + + "through solid objects such as walls, thus providing 'x-ray vision'-like capabilities.

" + "This augmentation:
" + "Increases the player's dexterity by 40%.
" + "Increases the player's hacking speed by 3%.
" + @@ -1235,7 +1235,7 @@ function initAugmentations() { name:AugmentationNames.LuminCloaking1, repCost:1.5e3, moneyCost:5e6, info:"A skin implant that reinforces the skin with highly-advanced synthetic cells. These " + "cells, when powered, have a negative refractive index. As a result, they bend light " + - "around the skin, making the user much harder to see from the naked eye.

" + + "around the skin, making the user much harder to see to the naked eye.

" + "This augmentation:
" + "Increases the player's agility by 5%.
" + "Increases the amount of money the player gains from crimes by 10%.", @@ -1290,7 +1290,7 @@ function initAugmentations() { const PowerRecirculator = new Augmentation({ name:AugmentationNames.PowerRecirculator, repCost:2.5e4, moneyCost:1.8e8, info:"The body's nerves are attached with polypyrrole nanocircuits that " + - "are capable of capturing wasted energy (in the form of heat) " + + "are capable of capturing wasted energy, in the form of heat, " + "and converting it back into usable power.

" + "This augmentation:
" + "Increases all of the player's stats by 5%.
" + @@ -1393,7 +1393,7 @@ function initAugmentations() { name:AugmentationNames.CordiARCReactor, repCost:1.125e6, moneyCost:5e9, info:"The thoracic cavity is equipped with a small chamber designed " + "to hold and sustain hydrogen plasma. The plasma is used to generate " + - "fusion power through nuclear fusion, providing limitless amount of clean " + + "fusion power through nuclear fusion, providing limitless amounts of clean " + "energy for the body.

" + "This augmentation:
" + "Increases all of the player's combat stats by 35%.
" + @@ -1456,7 +1456,7 @@ function initAugmentations() { const Xanipher = new Augmentation({ name:AugmentationNames.Xanipher, repCost:8.75e5, moneyCost:4.25e9, info:"A concoction of advanced nanobots that is orally ingested into the " + - "body. These nanobots induce physiological change and significantly " + + "body. These nanobots induce physiological changes and significantly " + "improve the body's functioning in all aspects.

" + "This augmentation:
" + "Increases all of the player's stats by 20%.
" + @@ -1484,7 +1484,7 @@ function initAugmentations() { name:AugmentationNames.HydroflameLeftArm, repCost:1.25e6, moneyCost:2.5e12, info:"The left arm of a legendary BitRunner who ascended beyond this world. " + "It projects a light blue energy shield that protects the exposed inner parts. " + - "Even though it contains no weapons, the advance tungsten titanium " + + "Even though it contains no weapons, the advanced tungsten titanium " + "alloy increases the users strength to unbelievable levels. The augmentation " + "gets more powerful over time for seemingly no reason.

" + "This augmentation increases the player's strength by 270%.", @@ -1561,7 +1561,7 @@ function initAugmentations() { const Neurolink = new Augmentation({ name:AugmentationNames.Neurolink, repCost:8.75e5, moneyCost:4.375e9, info:"A brain implant that provides a high-bandwidth, direct neural link between your " + - "mind and BitRunners' data servers, which reportedly contain " + + "mind and the BitRunners' data servers, which reportedly contain " + "the largest database of hacking tools and information in the world.

" + "This augmentation:
" + "Increases the player's hacking skill by 15%.
" + @@ -1585,8 +1585,8 @@ function initAugmentations() { name:AugmentationNames.TheBlackHand, repCost:1e5, moneyCost:5.5e8, info:"A highly advanced bionic hand. This prosthetic not only " + "enhances strength and dexterity but it is also embedded " + - "with hardware and firmware that lets the user connect to, access and hack " + - "devices and machines just by touching them.

" + + "with hardware and firmware that lets the user connect to, access, and hack " + + "devices and machines by just touching them.

" + "This augmentation:
" + "Increases the player's strength and dexterity by 15%.
" + "Increases the player's hacking skill by 10%.
" + @@ -1625,9 +1625,9 @@ function initAugmentations() { // Chongqing const Neuregen = new Augmentation({ name:AugmentationNames.Neuregen, repCost:3.75e4, moneyCost:3.75e8, - info:"A drug that genetically modifies the neurons in the brain. " + - "The result is that these neurons never die and continuously " + - "regenerate and strengthen themselves.

" + + info:"A drug that genetically modifies the neurons in the brain " + + "resulting in neurons never die, continuously " + + "regenerate, and strengthen themselves.

" + "This augmentation increases the player's hacking experience gain rate by 40%.", hacking_exp_mult: 1.4, }); @@ -1679,8 +1679,8 @@ function initAugmentations() { // Ishima const INFRARet = new Augmentation({ name:AugmentationNames.INFRARet, repCost:7.5e3, moneyCost:3e7, - info:"A retina implant consisting of a tiny chip that sits behind the " + - "retina. This implant lets people visually detect infrared radiation.

" + + info:"A tiny chip that sits behind the retinae. This implant lets the" + + "user visually detect infrared radiation.

" + "This augmentation:
" + "Increases the player's crime success rate by 25%.
" + "Increases the amount of money the player gains from crimes by 10%.
" + @@ -1698,7 +1698,7 @@ function initAugmentations() { // Volhaven const DermaForce = new Augmentation({ name:AugmentationNames.DermaForce, repCost:1.5e4, moneyCost:5e7, - info:"A synthetic skin is grafted onto the body. The skin consists of " + + info:"Synthetic skin that is grafted onto the body. This skin consists of " + "millions of nanobots capable of projecting high-density muon beams, " + "creating an energy barrier around the user.

" + "This augmentation increases the player's defense by 40%.", @@ -1715,7 +1715,7 @@ function initAugmentations() { name:AugmentationNames.GrapheneBrachiBlades, repCost:2.25e5, moneyCost:2.5e9, info:"An upgrade to the BrachiBlades augmentation. It infuses " + "the retractable blades with an advanced graphene material " + - "to make them much stronger and lighter.

" + + "making them stronger and lighter.

" + "This augmentation:
" + "Increases the player's strength and defense by 40%.
" + "Increases the player's crime success rate by 10%.
" + @@ -1737,7 +1737,7 @@ function initAugmentations() { name:AugmentationNames.GrapheneBionicArms, repCost:5e5, moneyCost:3.75e9, info:"An upgrade to the Bionic Arms augmentation. It infuses the " + "prosthetic arms with an advanced graphene material " + - "to make them much stronger and lighter.

" + + "to make them stronger and lighter.

" + "This augmentation increases the player's strength and dexterity by 85%.", prereqs:[AugmentationNames.BionicArms], strength_mult: 1.85, @@ -1752,7 +1752,7 @@ function initAugmentations() { // TheSyndicate const BrachiBlades = new Augmentation({ name:AugmentationNames.BrachiBlades, repCost:1.25e4, moneyCost:9e7, - info:"A set of retractable plasteel blades are implanted in the arm, underneath the skin.

" + + info:"A set of retractable plasteel blades that are implanted in the arm, underneath the skin.

" + "This augmentation:
" + "Increases the player's strength and defense by 15%.
" + "Increases the player's crime success rate by 10%.
" + @@ -1807,14 +1807,14 @@ function initAugmentations() { if (factionExists(BladeburnersFactionName)) { const EsperEyewear = new Augmentation({ name:AugmentationNames.EsperEyewear, repCost:1.25e3, moneyCost:1.65e8, - info:"Ballistic-grade protective and retractable eyewear that was designed specially " + + info:"Ballistic-grade protective and retractable eyewear that was designed specifically " + "for Bladeburner units. This " + "is implanted by installing a mechanical frame in the skull's orbit. " + "This frame interfaces with the brain and allows the user to " + "automatically extrude and extract the eyewear. The eyewear protects " + - "against debris, shrapnel, laser, flash, and gas. It is also " + + "against debris, shrapnel, lasers, blinding flashes, and gas. It is also " + "embedded with a data processing chip that can be programmed to display an " + - "AR HUD and assist the user in field missions.

" + + "AR HUD to assist the user in field missions.

" + "This augmentation:
" + "Increases the player's success chance in Bladeburner contracts/operations by 3%.
" + "Increases the player's dexterity by 5%.", @@ -1829,8 +1829,8 @@ function initAugmentations() { name:AugmentationNames.EMS4Recombination, repCost:2.5e3, moneyCost:2.75e8, info:"A DNA recombination of the EMS-4 Gene. This genetic engineering " + "technique was originally used on Bladeburners during the Synthoid uprising " + - "to induce wakefulness and concentration, suppress fear, reduce empathy, and " + - "improve reflexes and memory-recall among other things.

" + + "to induce wakefulness and concentration, suppress fear, reduce empathy, " + + "improve reflexes, and improve memory among other things.

" + "This augmentation:
" + "Increases the player's success chance in Bladeburner contracts/operations by 3%.
" + "Increases the player's effectiveness in Bladeburner Field Analysis by 5%.
" + @@ -1881,7 +1881,7 @@ function initAugmentations() { name:AugmentationNames.HyperionV2, repCost:2.5e4, moneyCost:5.5e9, info:"A pair of mini plasma cannons embedded into the hands. This augmentation " + "is more advanced and powerful than the original V1 model. This V2 model is " + - "more power-efficiency, more accurate, and can fire plasma bolts at a much " + + "more power-efficient, more accurate, and can fire plasma bolts at a much " + "higher velocity than the V1 model.

" + "This augmentation increases the player's success chance in Bladeburner contracts/operations by 8%.", prereqs:[AugmentationNames.HyperionV1], @@ -1893,8 +1893,8 @@ function initAugmentations() { const GolemSerum = new Augmentation({ name:AugmentationNames.GolemSerum, repCost:3.125e4, moneyCost:1.1e10, - info:"A serum that permanently enhances many aspects of a human's capabilities, " + - "including strength, speed, immune system performance, and mitochondrial efficiency. The " + + info:"A serum that permanently enhances many aspects of human capabilities, " + + "including strength, speed, immune system enhancements, and mitochondrial efficiency. The " + "serum was originally developed by the Chinese military in an attempt to " + "create super soldiers.

" + "This augmentation:
" + @@ -1912,7 +1912,7 @@ function initAugmentations() { const VangelisVirus = new Augmentation({ name:AugmentationNames.VangelisVirus, repCost:1.875e4, moneyCost:2.75e9, - info:"A synthetic symbiotic virus that is injected into the human brain tissue. The Vangelis virus " + + info:"A synthetic symbiotic virus that is injected into human brain tissue. The Vangelis virus " + "heightens the senses and focus of its host, and also enhances its intuition.

" + "This augmentation:
" + "Increases the player's effectiveness in Bladeburner Field Analysis by 10%.
" + @@ -1929,9 +1929,9 @@ function initAugmentations() { const VangelisVirus3 = new Augmentation({ name:AugmentationNames.VangelisVirus3, repCost:3.75e4, moneyCost:1.1e10, info:"An improved version of Vangelis, a synthetic symbiotic virus that is " + - "injected into the human brain tissue. On top of the benefits of the original " + + "injected into human brain tissue. On top of the benefits of the original " + "virus, this also grants an accelerated healing factor and enhanced " + - "agility/reflexes.

" + + "reflexes.

" + "This augmentation:
" + "Increases the player's effectiveness in Bladeburner Field Analysis by 15%.
" + "Increases the player's defense and dexterity experience gain rate by 10%.
" + @@ -1967,7 +1967,7 @@ function initAugmentations() { const BladeRunner = new Augmentation({ name:AugmentationNames.BladeRunner, repCost:2e4, moneyCost:8.25e9, - info:"A cybernetic foot augmentation that was specially created for Bladeburners " + + info:"A cybernetic foot augmentation that was specifically created for Bladeburners " + "during the Synthoid Uprising. The organic musculature of the human foot " + "is enhanced with flexible carbon nanotube matrices that are controlled by " + "intelligent servo-motors.

" + @@ -1985,10 +1985,10 @@ function initAugmentations() { const BladeArmor = new Augmentation({ name:AugmentationNames.BladeArmor, repCost:1.25e4, moneyCost:1.375e9, - info:"A powered exoskeleton suit (exosuit) designed as armor for Bladeburner units. This " + + info:"A powered exoskeleton suit designed as armor for Bladeburner units. This " + "exoskeleton is incredibly adaptable and can protect the wearer from blunt, piercing, " + "concussive, thermal, chemical, and electric trauma. It also enhances the user's " + - "strength and agility.

" + + "physical abilities.

" + "This augmentation:
" + "Increases all of the player's combat stats by 4%.
" + "Increases the player's Bladeburner stamina gain rate by 2%.
" + @@ -2039,7 +2039,7 @@ function initAugmentations() { const BladeArmorUnibeam = new Augmentation({ name:AugmentationNames.BladeArmorUnibeam, repCost:3.125e4, moneyCost:1.65e10, info:"Upgrades the BLADE-51b Tesla Armor with a concentrated deuterium-fluoride laser " + - "weapon. It's precision an accuracy makes it useful for quickly neutralizing " + + "weapon. It's precision and accuracy makes it useful for quickly neutralizing " + "threats while keeping casualties to a minimum.

" + "This augmentation increases the player's success chance in Bladeburner contracts/operations by 8%.", prereqs:[AugmentationNames.BladeArmor], @@ -2051,8 +2051,8 @@ function initAugmentations() { const BladeArmorOmnibeam = new Augmentation({ name:AugmentationNames.BladeArmorOmnibeam, repCost:6.25e4, moneyCost:2.75e10, - info:"Upgrades the BLADE-51b Tesla Armor Unibeam augmentation to use " + - "multiple-fiber system. The upgraded weapon uses multiple fiber laser " + + info:"Upgrades the BLADE-51b Tesla Armor Unibeam augmentation to use a " + + "multiple-fiber system. This upgraded weapon uses multiple fiber laser " + "modules that combine together to form a single, more powerful beam of up to " + "2000MW.

" + "This augmentation increases the player's success chance in Bladeburner contracts/operations by 10%.", @@ -2084,7 +2084,7 @@ function initAugmentations() { info:"A highly-advanced matter phase-shifter module that is embedded " + "in the brainstem and cerebellum. This augmentation allows " + "the user to project and control a holographic simulacrum within an " + - "extremely large radius. These specially-modified holograms were specially " + + "extremely large radius. These specially-modified holograms were specifically " + "weaponized by Bladeburner units to be used against Synthoids.

" + "This augmentation allows you to perform Bladeburner actions and other " + "actions (such as working, commiting crimes, etc.) at the same time.", From 0cb821b50d80a94afd98689c39d23fab479f71f1 Mon Sep 17 00:00:00 2001 From: Olivier Gagnon Date: Sun, 6 Jun 2021 14:46:33 -0400 Subject: [PATCH 31/32] lint --- src/Augmentation/Augmentation.ts | 1 - src/Augmentation/AugmentationHelpers.jsx | 32 ++++++++++++------------ src/Hacknet/ui/HacknetServer.jsx | 1 - src/NetscriptFunctions.js | 2 +- 4 files changed, 17 insertions(+), 19 deletions(-) diff --git a/src/Augmentation/Augmentation.ts b/src/Augmentation/Augmentation.ts index 853011c51..b6e0a53f9 100644 --- a/src/Augmentation/Augmentation.ts +++ b/src/Augmentation/Augmentation.ts @@ -1,5 +1,4 @@ // Class definition for a single Augmentation object -import { CONSTANTS } from "../Constants"; import { IMap } from "../types"; import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers"; diff --git a/src/Augmentation/AugmentationHelpers.jsx b/src/Augmentation/AugmentationHelpers.jsx index c15a3120e..f89970ff1 100644 --- a/src/Augmentation/AugmentationHelpers.jsx +++ b/src/Augmentation/AugmentationHelpers.jsx @@ -36,20 +36,20 @@ function getRandomBonus() { hacking_chance_mult: 1.25, hacking_speed_mult: 1.10, hacking_money_mult: 1.25, - hacking_grow_mult: 1.1 + hacking_grow_mult: 1.1, }, description: "Increases the player's hacking chance by 25%.
" + "Increases the player's hacking speed by 10%.
" + "Increases the amount of money the player's gains from hacking by 25%.
" + - "Increases the amount of money the player can inject into servers using grow() by 10%." + "Increases the amount of money the player can inject into servers using grow() by 10%.", }, { bonuses: { hacking_mult: 1.15, - hacking_exp_mult: 2 + hacking_exp_mult: 2, }, description: "Increases the player's hacking skill by 15%.
" + - "Increases the player's hacking experience gain rate by 100%." + "Increases the player's hacking experience gain rate by 100%.", }, { bonuses: { @@ -60,18 +60,18 @@ function getRandomBonus() { dexterity_mult: 1.25, dexterity_exp_mult: 1.5, agility_mult: 1.25, - agility_exp_mult: 1.5 + agility_exp_mult: 1.5, }, description: "Increases all of the player's combat stats by 25%.
" + - "Increases all of the player's combat stat experience gain rate by 100%." + "Increases all of the player's combat stat experience gain rate by 100%.", }, { bonuses: { charisma_mult: 1.5, - charisma_exp_mult: 2 + charisma_exp_mult: 2, }, description: "This augmentation increases the player's charisma by 50%.
" + - "Increases the player's charisma experience gain rate by 100%." + "Increases the player's charisma experience gain rate by 100%.", }, { bonuses: { @@ -79,29 +79,29 @@ function getRandomBonus() { hacknet_node_purchase_cost_mult: 0.85, hacknet_node_ram_cost_mult: 0.85, hacknet_node_core_cost_mult: 0.85, - hacknet_node_level_cost_mult: 0.85 + hacknet_node_level_cost_mult: 0.85, }, description: "Increases the amount of money produced by Hacknet Nodes by 20%.
" + - "Decreases all costs related to Hacknet Node by 15%." + "Decreases all costs related to Hacknet Node by 15%.", }, { bonuses: { company_rep_mult: 1.25, faction_rep_mult: 1.15, - work_money_mult: 1.7 + work_money_mult: 1.7, }, description: "Increases the amount of money the player gains from working by 70%.
" + "Increases the amount of reputation the player gains when working for a company by 25%.
" + - "Increases the amount of reputation the player gains for a faction by 15%." + "Increases the amount of reputation the player gains for a faction by 15%.", }, { bonuses: { crime_success_mult: 2, - crime_money_mult: 2 + crime_money_mult: 2, }, description: "Increases the player's crime success rate by 100%.
" + - "Increases the amount of money the player gains from crimes by 100%." - } + "Increases the amount of money the player gains from crimes by 100%.", + }, ] const randomNumber = (new WHRNG(Math.floor(Player.lastUpdate/3600000))); @@ -126,7 +126,7 @@ function initAugmentations() { const UnstableCircadianModulator = new Augmentation({ name:AugmentationNames.UnstableCircadianModulator, moneyCost:5e9, repCost:3.625e5, info:"An experimental nanobot injection. Its unstable nature leads to unpredictable results based on your circadian rhythm.

" + - "This augmentation:
" + randomBonuses.description + "

For now ..." + "This augmentation:
" + randomBonuses.description + "

For now ...", }); Object.keys(randomBonuses.bonuses).forEach(key => UnstableCircadianModulator.mults[key] = randomBonuses.bonuses[key]); diff --git a/src/Hacknet/ui/HacknetServer.jsx b/src/Hacknet/ui/HacknetServer.jsx index 8d95ff564..08730930d 100644 --- a/src/Hacknet/ui/HacknetServer.jsx +++ b/src/Hacknet/ui/HacknetServer.jsx @@ -18,7 +18,6 @@ import { } from "../HacknetHelpers"; import { Player } from "../../Player"; -import { numeralWrapper } from "../../ui/numeralFormat"; import { Money } from "../../ui/React/Money"; import { Hashes } from "../../ui/React/Hashes"; diff --git a/src/NetscriptFunctions.js b/src/NetscriptFunctions.js index 1e96762f3..a66534b66 100644 --- a/src/NetscriptFunctions.js +++ b/src/NetscriptFunctions.js @@ -867,7 +867,7 @@ function NetscriptFunctions(workerScript) { if (workerScript.env.stopFlag) {return Promise.reject(workerScript);} const moneyBefore = server.moneyAvailable <= 0 ? 1 : server.moneyAvailable; server.moneyAvailable += (1 * threads); // It can be grown even if it has no money - var growthPercentage = processSingleServerGrowth(server, threads, Player); + processSingleServerGrowth(server, threads, Player); const moneyAfter = server.moneyAvailable; workerScript.scriptRef.recordGrow(server.ip, threads); var expGain = calculateHackingExpGain(server, Player) * threads; From 0fc6f908637c5f0acff9b8dbc2ac4c66ba1769af Mon Sep 17 00:00:00 2001 From: Olivier Gagnon Date: Sun, 6 Jun 2021 14:53:31 -0400 Subject: [PATCH 32/32] push 0.51.11 early for a player --- dist/engine.bundle.js | 4 ++-- dist/vendor.bundle.js | 24 ++++++++++++------------ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/dist/engine.bundle.js b/dist/engine.bundle.js index cc25f4f74..66485b298 100644 --- a/dist/engine.bundle.js +++ b/dist/engine.bundle.js @@ -1,4 +1,4 @@ -!function(e){function t(t){for(var r,o,s=t[0],l=t[1],c=t[2],m=0,p=[];m${e}`;a.getElementById("terminal-input").insertAdjacentHTML("beforebegin",r),function(){const e=a.getElementById("terminal-container");e.scrollTop=e.scrollHeight}()}t.post=function(e){i(e)},t.postError=function(e){i(`ERROR: ${e}`,{color:"#ff2929"})},t.hackProgressBarPost=function(e){i(e,{id:"hack-progress-bar"})},t.hackProgressPost=function(e){i(e,{id:"hack-progress"})},t.postElement=function(e){i(r.renderToStaticMarkup(e))},t.postContent=i},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CONSTANTS=void 0,t.CONSTANTS={Version:"0.51.10",MaxSkillLevel:975,MilliPerCycle:200,CorpFactionRepRequirement:2e5,BaseCostFor1GBOfRamHome:32e3,BaseCostFor1GBOfRamServer:55e3,TravelCost:2e5,BaseFavorToDonate:150,DonateMoneyToRepDivisor:1e6,FactionReputationToFavorBase:500,FactionReputationToFavorMult:1.02,CompanyReputationToFavorBase:500,CompanyReputationToFavorMult:1.02,NeuroFluxGovernorLevelMult:1.14,NumNetscriptPorts:20,HomeComputerMaxRam:1073741824,ServerBaseGrowthRate:1.03,ServerMaxGrowthRate:1.0035,ServerFortifyAmount:.002,ServerWeakenAmount:.05,PurchasedServerLimit:25,PurchasedServerMaxRam:1048576,AugmentationCostMultiplier:5,AugmentationRepMultiplier:2.5,MultipleAugMultiplier:1.9,TorRouterCost:2e5,InfiltrationBribeBaseAmount:1e5,InfiltrationMoneyValue:5e3,InfiltrationRepValue:1.4,InfiltrationExpPow:.8,WSEAccountCost:2e8,TIXAPICost:5e9,MarketData4SCost:1e9,MarketDataTixApi4SCost:25e9,StockMarketCommission:1e5,HospitalCostPerHp:1e5,IntelligenceCrimeWeight:.025,IntelligenceInfiltrationWeight:.1,IntelligenceCrimeBaseExpGain:.05,IntelligenceProgramBaseExpGain:2.5,IntelligenceTerminalHackBaseExpGain:200,IntelligenceSingFnBaseExpGain:1.5,IntelligenceClassBaseExpGain:.01,IntelligenceHackingMissionBaseExpGain:3,HackingMissionRepToDiffConversion:1e4,HackingMissionRepToRewardConversion:7,HackingMissionSpamTimeIncrease:25e3,HackingMissionTransferAttackIncrease:1.05,HackingMissionMiscDefenseIncrease:1.05,HackingMissionDifficultyToHacking:135,HackingMissionHowToPlay:"Hacking missions are a minigame that, if won, will reward you with faction reputation.

In this game you control a set of Nodes and use them to try and defeat an enemy. Your Nodes are colored blue, while the enemy's are red. There are also other nodes on the map colored gray that initially belong to neither you nor the enemy. The goal of the game is to capture all of the enemy's Database nodes within the time limit. If you fail to do this, you will lose.

Each Node has three stats: Attack, Defense, and HP. There are five different actions that a Node can take:

Attack - Targets an enemy Node and lowers its HP. The effectiveness is determined by the owner's Attack, the Player's hacking level, and the enemy's defense.

Scan - Targets an enemy Node and lowers its Defense. The effectiveness is determined by the owner's Attack, the Player's hacking level, and the enemy's defense.

Weaken - Targets an enemy Node and lowers its Attack. The effectiveness is determined by the owner's Attack, the Player's hacking level, and the enemy's defense.

Fortify - Raises the Node's Defense. The effectiveness is determined by your hacking level.

Overflow - Raises the Node's Attack but lowers its Defense. The effectiveness is determined by your hacking level.

Note that when determining the effectiveness of the above actions, the TOTAL Attack or Defense of the team is used, not just the Attack/Defense of the individual Node that is performing the action.

To capture a Node, you must lower its HP down to 0.

There are six different types of Nodes:

CPU Core - These are your main Nodes that are used to perform actions. Capable of performing every action

Firewall - Nodes with high defense. These Nodes can 'Fortify'

Database - A special type of Node. The player's objective is to conquer all of the enemy's Database Nodes within the time limit. These Nodes cannot perform any actions

Spam - Conquering one of these Nodes will slow the enemy's trace, giving the player additional time to complete the mission. These Nodes cannot perform any actions

Transfer - Conquering one of these nodes will increase the Attack of all of your CPU Cores by a small fixed percentage. These Nodes are capable of performing every action except the 'Attack' action

Shield - Nodes with high defense. These Nodes can 'Fortify'

To assign an action to a Node, you must first select one of your Nodes. This can be done by simply clicking on it. Double-clicking a node will select all of your Nodes of the same type (e.g. select all CPU Core Nodes or all Transfer Nodes). Note that only Nodes that can perform actions (CPU Core, Transfer, Shield, Firewall) can be selected. Selected Nodes will be denoted with a white highlight. After selecting a Node or multiple Nodes, select its action using the Action Buttons near the top of the screen. Every action also has a corresponding keyboard shortcut.

For certain actions such as attacking, scanning, and weakening, the Node performing the action must have a target. To target another node, simply click-and-drag from the 'source' Node to a target. A Node can only have one target, and you can target any Node that is adjacent to one of your Nodes (immediately above, below, or to the side. NOT diagonal). Furthermore, only CPU Cores and Transfer Nodes can target, since they are the only ones that can perform the related actions. To remove a target, you can simply click on the line that represents the connection between one of your Nodes and its target. Alternatively, you can select the 'source' Node and click the 'Drop Connection' button, or press 'd'.

Other Notes:

-Whenever a miscellenaous Node (not owned by the player or enemy) is conquered, the defense of all remaining miscellaneous Nodes that are not actively being targeted will increase by a fixed percentage.

-Whenever a Node is conquered, its stats are significantly reduced

-Miscellaneous Nodes slowly raise their defense over time

-Nodes slowly regenerate health over time.",MillisecondsPer20Hours:72e6,GameCyclesPer20Hours:36e4,MillisecondsPer10Hours:36e6,GameCyclesPer10Hours:18e4,MillisecondsPer8Hours:288e5,GameCyclesPer8Hours:144e3,MillisecondsPer4Hours:144e5,GameCyclesPer4Hours:72e3,MillisecondsPer2Hours:72e5,GameCyclesPer2Hours:36e3,MillisecondsPerHour:36e5,GameCyclesPerHour:18e3,MillisecondsPerHalfHour:18e5,GameCyclesPerHalfHour:9e3,MillisecondsPerQuarterHour:9e5,GameCyclesPerQuarterHour:4500,MillisecondsPerFiveMinutes:3e5,GameCyclesPerFiveMinutes:1500,FactionWorkHacking:"Faction Hacking Work",FactionWorkField:"Faction Field Work",FactionWorkSecurity:"Faction Security Work",WorkTypeCompany:"Working for Company",WorkTypeCompanyPartTime:"Working for Company part-time",WorkTypeFaction:"Working for Faction",WorkTypeCreateProgram:"Working on Create a Program",WorkTypeStudyClass:"Studying or Taking a class at university",WorkTypeCrime:"Committing a crime",ClassStudyComputerScience:"studying Computer Science",ClassDataStructures:"taking a Data Structures course",ClassNetworks:"taking a Networks course",ClassAlgorithms:"taking an Algorithms course",ClassManagement:"taking a Management course",ClassLeadership:"taking a Leadership course",ClassGymStrength:"training your strength at a gym",ClassGymDefense:"training your defense at a gym",ClassGymDexterity:"training your dexterity at a gym",ClassGymAgility:"training your agility at a gym",ClassDataStructuresBaseCost:40,ClassNetworksBaseCost:80,ClassAlgorithmsBaseCost:320,ClassManagementBaseCost:160,ClassLeadershipBaseCost:320,ClassGymBaseCost:120,ClassStudyComputerScienceBaseExp:.5,ClassDataStructuresBaseExp:1,ClassNetworksBaseExp:2,ClassAlgorithmsBaseExp:4,ClassManagementBaseExp:2,ClassLeadershipBaseExp:4,CrimeShoplift:"shoplift",CrimeRobStore:"rob a store",CrimeMug:"mug someone",CrimeLarceny:"commit larceny",CrimeDrugs:"deal drugs",CrimeBondForgery:"forge corporate bonds",CrimeTraffickArms:"traffick illegal arms",CrimeHomicide:"commit homicide",CrimeGrandTheftAuto:"commit grand theft auto",CrimeKidnap:"kidnap someone for ransom",CrimeAssassination:"assassinate a high-profile target",CrimeHeist:"pull off the ultimate heist",CodingContractBaseFactionRepGain:2500,CodingContractBaseCompanyRepGain:4e3,CodingContractBaseMoneyGain:75e6,TotalNumBitNodes:24,LatestUpdate:"\n v0.51.10 - 2021-05-31 Focus Mark, Focus! (hydroflame)\n -------\n\n Focus\n * You can now use the terminal and write scripts while working for factions\n but you will gain reputation at a slower rate.\n\n SF -1\n * Added a new SF -1: Bypass\n\n Gang\n * \"Vigilante justice\"/\"Ethical hacking\" now reduces wanted level by a very\n small percentage as well an absolute value.\n\n Netscript\n * 'tFormat' now has a second argument to display with millisecond precision.\n * 'purchaseSleeveAug' can no longer purchase the same aug over and over for\n the same sleeve.\n * fix typo in logging for 'getServerSecurityLevel'\n * Fixed some weird issue where very rarely you would get 0 exp from 'grow'\n * 'getActionTime' now returns correct values for Diplomacy and Regeneration.\n\n Corporations\n * Fixed an exploit where you could get nearly infinite corporation funds by\n entering negative numbers in textboxes.\n * Fixed an exploit where shares could be sold again by clicking the\n \"sell share\" button via scripts.\n\n Documentation\n * typo fix in purchaseTor\n * typo fix in basicgameplay/stats\n\n Misc.\n * Very large number will no longer appear as \"$NaNt\"\n * Hash capacity now displays in the \"big number\" format.\n "}},,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getRamCost=t.RamCosts=t.RamCostConstants=void 0,t.RamCostConstants={ScriptBaseRamCost:1.6,ScriptDomRamCost:25,ScriptHackRamCost:.1,ScriptHackAnalyzeRamCost:1,ScriptGrowRamCost:.15,ScriptGrowthAnalyzeRamCost:1,ScriptWeakenRamCost:.15,ScriptScanRamCost:.2,ScriptPortProgramRamCost:.05,ScriptRunRamCost:1,ScriptExecRamCost:1.3,ScriptSpawnRamCost:2,ScriptScpRamCost:.6,ScriptKillRamCost:.5,ScriptHasRootAccessRamCost:.05,ScriptGetHostnameRamCost:.05,ScriptGetHackingLevelRamCost:.05,ScriptGetMultipliersRamCost:4,ScriptGetServerRamCost:.1,ScriptGetServerMaxRam:.05,ScriptGetServerUsedRam:.05,ScriptFileExistsRamCost:.1,ScriptIsRunningRamCost:.1,ScriptHacknetNodesRamCost:4,ScriptHNUpgLevelRamCost:.4,ScriptHNUpgRamRamCost:.6,ScriptHNUpgCoreRamCost:.8,ScriptGetStockRamCost:2,ScriptBuySellStockRamCost:2.5,ScriptGetPurchaseServerRamCost:.25,ScriptPurchaseServerRamCost:2.25,ScriptGetPurchasedServerLimit:.05,ScriptGetPurchasedServerMaxRam:.05,ScriptRoundRamCost:.05,ScriptReadWriteRamCost:1,ScriptArbScriptRamCost:1,ScriptGetScriptRamCost:.1,ScriptGetRunningScriptRamCost:.3,ScriptGetHackTimeRamCost:.05,ScriptGetFavorToDonate:.1,ScriptCodingContractBaseRamCost:10,ScriptSleeveBaseRamCost:4,ScriptSingularityFn1RamCost:2,ScriptSingularityFn2RamCost:3,ScriptSingularityFn3RamCost:5,ScriptGangApiBaseRamCost:4,ScriptBladeburnerApiBaseRamCost:4},t.RamCosts={hacknet:{numNodes:()=>0,purchaseNode:()=>0,getPurchaseNodeCost:()=>0,getNodeStats:()=>0,upgradeLevel:()=>0,upgradeRam:()=>0,upgradeCore:()=>0,upgradeCache:()=>0,getLevelUpgradeCost:()=>0,getRamUpgradeCost:()=>0,getCoreUpgradeCost:()=>0,getCacheUpgradeCost:()=>0,numHashes:()=>0,hashCost:()=>0,spendHashes:()=>0},sprintf:()=>0,vsprintf:()=>0,scan:()=>t.RamCostConstants.ScriptScanRamCost,hack:()=>t.RamCostConstants.ScriptHackRamCost,hackAnalyzeThreads:()=>t.RamCostConstants.ScriptHackAnalyzeRamCost,hackAnalyzePercent:()=>t.RamCostConstants.ScriptHackAnalyzeRamCost,hackChance:()=>t.RamCostConstants.ScriptHackAnalyzeRamCost,sleep:()=>0,grow:()=>t.RamCostConstants.ScriptGrowRamCost,growthAnalyze:()=>t.RamCostConstants.ScriptGrowthAnalyzeRamCost,weaken:()=>t.RamCostConstants.ScriptWeakenRamCost,print:()=>0,tprint:()=>0,clearLog:()=>0,disableLog:()=>0,enableLog:()=>0,isLogEnabled:()=>0,getScriptLogs:()=>0,nuke:()=>t.RamCostConstants.ScriptPortProgramRamCost,brutessh:()=>t.RamCostConstants.ScriptPortProgramRamCost,ftpcrack:()=>t.RamCostConstants.ScriptPortProgramRamCost,relaysmtp:()=>t.RamCostConstants.ScriptPortProgramRamCost,httpworm:()=>t.RamCostConstants.ScriptPortProgramRamCost,sqlinject:()=>t.RamCostConstants.ScriptPortProgramRamCost,run:()=>t.RamCostConstants.ScriptRunRamCost,exec:()=>t.RamCostConstants.ScriptExecRamCost,spawn:()=>t.RamCostConstants.ScriptSpawnRamCost,kill:()=>t.RamCostConstants.ScriptKillRamCost,killall:()=>t.RamCostConstants.ScriptKillRamCost,exit:()=>0,scp:()=>t.RamCostConstants.ScriptScpRamCost,ls:()=>t.RamCostConstants.ScriptScanRamCost,ps:()=>t.RamCostConstants.ScriptScanRamCost,hasRootAccess:()=>t.RamCostConstants.ScriptHasRootAccessRamCost,getIp:()=>t.RamCostConstants.ScriptGetHostnameRamCost,getHostname:()=>t.RamCostConstants.ScriptGetHostnameRamCost,getHackingLevel:()=>t.RamCostConstants.ScriptGetHackingLevelRamCost,getHackingMultipliers:()=>t.RamCostConstants.ScriptGetMultipliersRamCost,getHacknetMultipliers:()=>t.RamCostConstants.ScriptGetMultipliersRamCost,getBitNodeMultipliers:()=>t.RamCostConstants.ScriptGetMultipliersRamCost,getServer:()=>t.RamCostConstants.ScriptGetMultipliersRamCost/2,getServerMoneyAvailable:()=>t.RamCostConstants.ScriptGetServerRamCost,getServerSecurityLevel:()=>t.RamCostConstants.ScriptGetServerRamCost,getServerBaseSecurityLevel:()=>t.RamCostConstants.ScriptGetServerRamCost,getServerMinSecurityLevel:()=>t.RamCostConstants.ScriptGetServerRamCost,getServerRequiredHackingLevel:()=>t.RamCostConstants.ScriptGetServerRamCost,getServerMaxMoney:()=>t.RamCostConstants.ScriptGetServerRamCost,getServerGrowth:()=>t.RamCostConstants.ScriptGetServerRamCost,getServerNumPortsRequired:()=>t.RamCostConstants.ScriptGetServerRamCost,getServerRam:()=>t.RamCostConstants.ScriptGetServerRamCost,getServerMaxRam:()=>t.RamCostConstants.ScriptGetServerMaxRam,getServerUsedRam:()=>t.RamCostConstants.ScriptGetServerUsedRam,serverExists:()=>t.RamCostConstants.ScriptGetServerRamCost,fileExists:()=>t.RamCostConstants.ScriptFileExistsRamCost,isRunning:()=>t.RamCostConstants.ScriptIsRunningRamCost,getStockSymbols:()=>t.RamCostConstants.ScriptGetStockRamCost,getStockPrice:()=>t.RamCostConstants.ScriptGetStockRamCost,getStockAskPrice:()=>t.RamCostConstants.ScriptGetStockRamCost,getStockBidPrice:()=>t.RamCostConstants.ScriptGetStockRamCost,getStockPosition:()=>t.RamCostConstants.ScriptGetStockRamCost,getStockMaxShares:()=>t.RamCostConstants.ScriptGetStockRamCost,getStockPurchaseCost:()=>t.RamCostConstants.ScriptGetStockRamCost,getStockSaleGain:()=>t.RamCostConstants.ScriptGetStockRamCost,buyStock:()=>t.RamCostConstants.ScriptBuySellStockRamCost,sellStock:()=>t.RamCostConstants.ScriptBuySellStockRamCost,shortStock:()=>t.RamCostConstants.ScriptBuySellStockRamCost,sellShort:()=>t.RamCostConstants.ScriptBuySellStockRamCost,placeOrder:()=>t.RamCostConstants.ScriptBuySellStockRamCost,cancelOrder:()=>t.RamCostConstants.ScriptBuySellStockRamCost,getOrders:()=>t.RamCostConstants.ScriptBuySellStockRamCost,getStockVolatility:()=>t.RamCostConstants.ScriptBuySellStockRamCost,getStockForecast:()=>t.RamCostConstants.ScriptBuySellStockRamCost,purchase4SMarketData:()=>t.RamCostConstants.ScriptBuySellStockRamCost,purchase4SMarketDataTixApi:()=>t.RamCostConstants.ScriptBuySellStockRamCost,getPurchasedServerLimit:()=>t.RamCostConstants.ScriptGetPurchasedServerLimit,getPurchasedServerMaxRam:()=>t.RamCostConstants.ScriptGetPurchasedServerMaxRam,getPurchasedServerCost:()=>t.RamCostConstants.ScriptGetPurchaseServerRamCost,purchaseServer:()=>t.RamCostConstants.ScriptPurchaseServerRamCost,deleteServer:()=>t.RamCostConstants.ScriptPurchaseServerRamCost,getPurchasedServers:()=>t.RamCostConstants.ScriptPurchaseServerRamCost,write:()=>t.RamCostConstants.ScriptReadWriteRamCost,tryWrite:()=>t.RamCostConstants.ScriptReadWriteRamCost,read:()=>t.RamCostConstants.ScriptReadWriteRamCost,peek:()=>t.RamCostConstants.ScriptReadWriteRamCost,clear:()=>t.RamCostConstants.ScriptReadWriteRamCost,getPortHandle:()=>10*t.RamCostConstants.ScriptReadWriteRamCost,rm:()=>t.RamCostConstants.ScriptReadWriteRamCost,scriptRunning:()=>t.RamCostConstants.ScriptArbScriptRamCost,scriptKill:()=>t.RamCostConstants.ScriptArbScriptRamCost,getScriptName:()=>0,getScriptRam:()=>t.RamCostConstants.ScriptGetScriptRamCost,getHackTime:()=>t.RamCostConstants.ScriptGetHackTimeRamCost,getGrowTime:()=>t.RamCostConstants.ScriptGetHackTimeRamCost,getWeakenTime:()=>t.RamCostConstants.ScriptGetHackTimeRamCost,getScriptIncome:()=>t.RamCostConstants.ScriptGetScriptRamCost,getScriptExpGain:()=>t.RamCostConstants.ScriptGetScriptRamCost,getRunningScript:()=>t.RamCostConstants.ScriptGetRunningScriptRamCost,nFormat:()=>0,getTimeSinceLastAug:()=>t.RamCostConstants.ScriptGetHackTimeRamCost,prompt:()=>0,wget:()=>0,getFavorToDonate:()=>t.RamCostConstants.ScriptGetFavorToDonate,universityCourse:()=>t.RamCostConstants.ScriptSingularityFn1RamCost,gymWorkout:()=>t.RamCostConstants.ScriptSingularityFn1RamCost,travelToCity:()=>t.RamCostConstants.ScriptSingularityFn1RamCost,purchaseTor:()=>t.RamCostConstants.ScriptSingularityFn1RamCost,purchaseProgram:()=>t.RamCostConstants.ScriptSingularityFn1RamCost,getCurrentServer:()=>t.RamCostConstants.ScriptSingularityFn1RamCost,connect:()=>t.RamCostConstants.ScriptSingularityFn1RamCost,manualHack:()=>t.RamCostConstants.ScriptSingularityFn1RamCost,installBackdoor:()=>t.RamCostConstants.ScriptSingularityFn1RamCost,getStats:()=>t.RamCostConstants.ScriptSingularityFn1RamCost/4,getCharacterInformation:()=>t.RamCostConstants.ScriptSingularityFn1RamCost/4,getPlayer:()=>t.RamCostConstants.ScriptSingularityFn1RamCost/4,hospitalize:()=>t.RamCostConstants.ScriptSingularityFn1RamCost/4,isBusy:()=>t.RamCostConstants.ScriptSingularityFn1RamCost/4,stopAction:()=>t.RamCostConstants.ScriptSingularityFn1RamCost/2,upgradeHomeRam:()=>t.RamCostConstants.ScriptSingularityFn2RamCost,getUpgradeHomeRamCost:()=>t.RamCostConstants.ScriptSingularityFn2RamCost/2,workForCompany:()=>t.RamCostConstants.ScriptSingularityFn2RamCost,applyToCompany:()=>t.RamCostConstants.ScriptSingularityFn2RamCost,getCompanyRep:()=>t.RamCostConstants.ScriptSingularityFn2RamCost/3,getCompanyFavor:()=>t.RamCostConstants.ScriptSingularityFn2RamCost/3,getCompanyFavorGain:()=>t.RamCostConstants.ScriptSingularityFn2RamCost/4,checkFactionInvitations:()=>t.RamCostConstants.ScriptSingularityFn2RamCost,joinFaction:()=>t.RamCostConstants.ScriptSingularityFn2RamCost,workForFaction:()=>t.RamCostConstants.ScriptSingularityFn2RamCost,getFactionRep:()=>t.RamCostConstants.ScriptSingularityFn2RamCost/3,getFactionFavor:()=>t.RamCostConstants.ScriptSingularityFn2RamCost/3,getFactionFavorGain:()=>t.RamCostConstants.ScriptSingularityFn2RamCost/4,donateToFaction:()=>t.RamCostConstants.ScriptSingularityFn3RamCost,createProgram:()=>t.RamCostConstants.ScriptSingularityFn3RamCost,commitCrime:()=>t.RamCostConstants.ScriptSingularityFn3RamCost,getCrimeChance:()=>t.RamCostConstants.ScriptSingularityFn3RamCost,getCrimeStats:()=>t.RamCostConstants.ScriptSingularityFn3RamCost,getOwnedAugmentations:()=>t.RamCostConstants.ScriptSingularityFn3RamCost,getOwnedSourceFiles:()=>t.RamCostConstants.ScriptSingularityFn3RamCost,getAugmentationsFromFaction:()=>t.RamCostConstants.ScriptSingularityFn3RamCost,getAugmentationPrereq:()=>t.RamCostConstants.ScriptSingularityFn3RamCost,getAugmentationCost:()=>t.RamCostConstants.ScriptSingularityFn3RamCost,getAugmentationStats:()=>t.RamCostConstants.ScriptSingularityFn3RamCost,purchaseAugmentation:()=>t.RamCostConstants.ScriptSingularityFn3RamCost,softReset:()=>t.RamCostConstants.ScriptSingularityFn3RamCost,installAugmentations:()=>t.RamCostConstants.ScriptSingularityFn3RamCost,gang:{getMemberNames:()=>t.RamCostConstants.ScriptGangApiBaseRamCost/4,getGangInformation:()=>t.RamCostConstants.ScriptGangApiBaseRamCost/2,getOtherGangInformation:()=>t.RamCostConstants.ScriptGangApiBaseRamCost/2,getMemberInformation:()=>t.RamCostConstants.ScriptGangApiBaseRamCost/2,canRecruitMember:()=>t.RamCostConstants.ScriptGangApiBaseRamCost/4,recruitMember:()=>t.RamCostConstants.ScriptGangApiBaseRamCost/2,getTaskNames:()=>t.RamCostConstants.ScriptGangApiBaseRamCost/4,getTaskStats:()=>t.RamCostConstants.ScriptGangApiBaseRamCost/4,setMemberTask:()=>t.RamCostConstants.ScriptGangApiBaseRamCost/2,getEquipmentNames:()=>t.RamCostConstants.ScriptGangApiBaseRamCost/4,getEquipmentCost:()=>t.RamCostConstants.ScriptGangApiBaseRamCost/2,getEquipmentType:()=>t.RamCostConstants.ScriptGangApiBaseRamCost/2,getEquipmentStats:()=>t.RamCostConstants.ScriptGangApiBaseRamCost/2,purchaseEquipment:()=>t.RamCostConstants.ScriptGangApiBaseRamCost,ascendMember:()=>t.RamCostConstants.ScriptGangApiBaseRamCost,setTerritoryWarfare:()=>t.RamCostConstants.ScriptGangApiBaseRamCost/2,getChanceToWinClash:()=>t.RamCostConstants.ScriptGangApiBaseRamCost,getBonusTime:()=>0},bladeburner:{getContractNames:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost/10,getOperationNames:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost/10,getBlackOpNames:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost/10,getBlackOpRank:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost/2,getGeneralActionNames:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost/10,getSkillNames:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost/10,startAction:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,stopBladeburnerAction:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost/2,getCurrentAction:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost/4,getActionTime:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,getActionEstimatedSuccessChance:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,getActionRepGain:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,getActionCountRemaining:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,getActionMaxLevel:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,getActionCurrentLevel:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,getActionAutolevel:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,setActionAutolevel:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,setActionLevel:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,getRank:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,getSkillPoints:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,getSkillLevel:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,getSkillUpgradeCost:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,upgradeSkill:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,getTeamSize:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,setTeamSize:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,getCityEstimatedPopulation:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,getCityEstimatedCommunities:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,getCityChaos:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,getCity:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,switchCity:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,getStamina:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,joinBladeburnerFaction:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,joinBladeburnerDivision:()=>t.RamCostConstants.ScriptBladeburnerApiBaseRamCost,getBonusTime:()=>0},codingcontract:{attempt:()=>t.RamCostConstants.ScriptCodingContractBaseRamCost,getContractType:()=>t.RamCostConstants.ScriptCodingContractBaseRamCost/2,getData:()=>t.RamCostConstants.ScriptCodingContractBaseRamCost/2,getDescription:()=>t.RamCostConstants.ScriptCodingContractBaseRamCost/2,getNumTriesRemaining:()=>t.RamCostConstants.ScriptCodingContractBaseRamCost/5},sleeve:{getNumSleeves:()=>t.RamCostConstants.ScriptSleeveBaseRamCost,setToShockRecovery:()=>t.RamCostConstants.ScriptSleeveBaseRamCost,setToSynchronize:()=>t.RamCostConstants.ScriptSleeveBaseRamCost,setToCommitCrime:()=>t.RamCostConstants.ScriptSleeveBaseRamCost,setToUniversityCourse:()=>t.RamCostConstants.ScriptSleeveBaseRamCost,travel:()=>t.RamCostConstants.ScriptSleeveBaseRamCost,setToCompanyWork:()=>t.RamCostConstants.ScriptSleeveBaseRamCost,setToFactionWork:()=>t.RamCostConstants.ScriptSleeveBaseRamCost,setToGymWorkout:()=>t.RamCostConstants.ScriptSleeveBaseRamCost,getSleeveStats:()=>t.RamCostConstants.ScriptSleeveBaseRamCost,getTask:()=>t.RamCostConstants.ScriptSleeveBaseRamCost,getInformation:()=>t.RamCostConstants.ScriptSleeveBaseRamCost,getSleeveAugmentations:()=>t.RamCostConstants.ScriptSleeveBaseRamCost,getSleevePurchasableAugs:()=>t.RamCostConstants.ScriptSleeveBaseRamCost,purchaseSleeveAug:()=>t.RamCostConstants.ScriptSleeveBaseRamCost},heart:{break:()=>0}},t.getRamCost=function(...e){if(0===e.length)return console.warn("No arguments passed to getRamCost()"),0;let n=t.RamCosts[e[0]];for(let t=1;t=1&&(e(t.target).closest(c[0]).length||u())}),e(document).on("click",".dialog-box-close-button",function(){u()}),document.addEventListener("keydown",function(e){e.keyCode==r.KEY.ESC&&m&&(u(),e.preventDefault())});let m=!1;function p(e,t=!1){const n=document.createElement("div");n.setAttribute("class","dialog-box-container");let r=e;"string"==typeof e&&(r=t?o.a.createElement("pre",{dangerouslySetInnerHTML:{__html:e}}):o.a.createElement("p",{dangerouslySetInnerHTML:{__html:e.replace(/(?:\r\n|\r|\n)/g,"
")}})),l.a.render(Object(a.DialogBox)(r),n),document.body.appendChild(n),c.length>=1&&(n.style.visibility="hidden"),c.push(n),setTimeout(function(){m=!0},400)}}.call(this,n(122))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.replaceAt=t.generateRandomString=t.isHTML=t.formatNumber=t.containsAllStrings=t.longestCommonStart=t.convertTimeMsToTimeElapsedString=void 0;const r=n(65);function a(e){return e.every(r.isString)}t.replaceAt=function(e,t,n){return e.substr(0,t)+n+e.substr(t+n.length)},t.convertTimeMsToTimeElapsedString=function(e,t=!1){e=Math.floor(e);const n=Math.floor(e/1e3),r=Math.floor(n/86400),a=n%86400,i=Math.floor(a/3600),o=a%3600,s=Math.floor(o/60),l=o%60,c=(()=>{let t=`${e%1e3}`;for(;t.length<3;)t="0"+t;return t})(),u=t?`${l}.${c}`:`${l}`;let m="";return r>0&&(m+=`${r} days `),i>0&&(m+=`${i} hours `),s>0&&(m+=`${s} minutes `),m+=`${u} seconds`},t.longestCommonStart=function(e){if(!a(e))return"";if(0===e.length)return"";const t=e.concat().sort(),n=t[0],r=t[t.length-1],i=n.length;let o=0;const s=(e,t)=>e.toUpperCase()===t.toUpperCase();for(;o=0;e--)if(1===n[e].nodeType)return!0;return!1},t.generateRandomString=function(e){let t="";const n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";for(let r=0;r(pe.loadFactionContent(),Object(f.displayFactionContent)(n),!1)})),e.appendChild(Object(ae.createElement)("br"))}();pe.Display.factionsContent.appendChild(e),pe.Display.factionsContent.appendChild(Object(ae.createElement)("br")),pe.Display.factionsContent.appendChild(Object(ae.createElement)("h1",{innerText:"Outstanding Faction Invitations"})),pe.Display.factionsContent.appendChild(Object(ae.createElement)("p",{width:"70%",innerText:"Lists factions you have been invited to. You can accept these faction invitations at any time."}));var n=Object(ae.createElement)("ul");for(t=0;t!!t.isTrusted&&(Object(f.joinFaction)(y.Factions[e]),pe.displayFactionsInfo(),!1)})),n.appendChild(r)}();pe.Display.factionsContent.appendChild(n)},idleTimer:function(){var e=(new Date).getTime(),t=e-pe._lastUpdate,n=t%pe._idleSpeed;(t=Math.floor(t/pe._idleSpeed))>0&&(pe._lastUpdate=e-n,x.Player.lastUpdate=e-n,pe.updateGame(t)),window.requestAnimationFrame(pe.idleTimer)},updateGame:function(e=1){var t=e*pe._idleSpeed;null==x.Player.totalPlaytime&&(x.Player.totalPlaytime=0),null==x.Player.playtimeSinceLastAug&&(x.Player.playtimeSinceLastAug=0),null==x.Player.playtimeSinceLastBitnode&&(x.Player.playtimeSinceLastBitnode=0),x.Player.totalPlaytime+=t,x.Player.playtimeSinceLastAug+=t,x.Player.playtimeSinceLastBitnode+=t,!0===U.a.actionStarted&&(pe._totalActionTime=U.a.actionTime,pe._actionTimeLeft=U.a.actionTime,pe._actionInProgress=!0,pe._actionProgressBarCount=1,pe._actionProgressStr="[ ]",pe._actionTimeStr="Time left: ",U.a.actionStarted=!1),x.Player.isWorking&&(x.Player.workType==_.CONSTANTS.WorkTypeFaction?x.Player.workForFaction(e):x.Player.workType==_.CONSTANTS.WorkTypeCreateProgram?x.Player.createProgramWork(e):x.Player.workType==_.CONSTANTS.WorkTypeStudyClass?x.Player.takeClass(e):x.Player.workType==_.CONSTANTS.WorkTypeCrime?x.Player.commitCrime(e):x.Player.workType==_.CONSTANTS.WorkTypeCompanyPartTime?x.Player.workPartTime(e):x.Player.work(e)),x.Player.hasWseAccount&&Object(W.processStockPrices)(e),x.Player.inGang()&&x.Player.gang.process(e,x.Player),O.c&&O.b&&O.b.process(e),x.Player.corporation instanceof d.c&&x.Player.corporation.storeCycles(e),x.Player.bladeburner instanceof c.a&&x.Player.bladeburner.storeCycles(e);for(let t=0;t0?(t.innerHTML=e,t.setAttribute("class","notification-on")):(t.innerHTML="",t.setAttribute("class","notification-off")),pe.Counters.createProgramNotifications=10}if(pe.Counters.augmentationsNotifications<=0){e=x.Player.queuedAugmentations.length,t=document.getElementById("augmentations-notification");e>0?(t.innerHTML=e,t.setAttribute("class","notification-on")):(t.innerHTML="",t.setAttribute("class","notification-off")),pe.Counters.augmentationsNotifications=10}if(pe.Counters.checkFactionInvitations<=0){var n=x.Player.checkForFactionInvitations();if(n.length>0){!1===x.Player.firstFacInvRecvd&&(x.Player.firstFacInvRecvd=!0,document.getElementById("factions-tab").style.display="list-item",document.getElementById("character-menu-header").click(),document.getElementById("character-menu-header").click());var r=n[Math.floor(Math.random()*n.length)];Object(f.inviteToFaction)(r)}const e=x.Player.factionInvitations.length,t=document.getElementById("factions-notification");e>0?(t.innerHTML=e,t.setAttribute("class","notification-on")):(t.innerHTML="",t.setAttribute("class","notification-off")),pe.Counters.checkFactionInvitations=100}if(pe.Counters.passiveFactionGrowth<=0){var o=Math.floor(5-pe.Counters.passiveFactionGrowth);Object(f.processPassiveFactionRepGain)(o),pe.Counters.passiveFactionGrowth=5}if(pe.Counters.messages<=0&&(Object(S.b)(),i.Augmentations[s.AugmentationNames.TheRedPill].owned?pe.Counters.messages=4500:pe.Counters.messages=150),pe.Counters.mechanicProcess<=0){if(x.Player.corporation instanceof d.c&&x.Player.corporation.process(),x.Player.bladeburner instanceof c.a)try{x.Player.bladeburner.process()}catch(e){Object(ie.exceptionAlert)("Exception caught in Bladeburner.process(): "+e)}pe.Counters.mechanicProcess=5}pe.Counters.contractGeneration<=0&&(Math.random()<=.25&&Object(p.generateRandomContract)(),pe.Counters.contractGeneration=3e3)},_totalActionTime:0,_actionTimeLeft:0,_actionTimeStr:"Time left: ",_actionProgressStr:"[ ]",_actionProgressBarCount:1,_actionInProgress:!1,updateHackProgress:function(e=1){var t=e*pe._idleSpeed;pe._actionTimeLeft-=t/1e3,pe._actionTimeLeft=Math.max(pe._actionTimeLeft,0);for(var n=Math.round(100*(1-pe._actionTimeLeft/pe._totalActionTime));2*pe._actionProgressBarCount<=n;)pe._actionProgressStr=Object(r.replaceAt)(pe._actionProgressStr,pe._actionProgressBarCount,"|"),pe._actionProgressBarCount+=1;pe._actionTimeStr="Time left: "+Math.max(0,Math.round(pe._actionTimeLeft)).toString()+"s",document.getElementById("hack-progress").innerHTML=pe._actionTimeStr,document.getElementById("hack-progress-bar").innerHTML=pe._actionProgressStr.replace(/ /g," "),n>=100&&(pe._actionInProgress=!1,U.a.finishAction())},closeMainMenuHeader:function(e){for(var t=0;t{switch(typeof e){case"number":return e;case"object":return s.getRandomInt(e.min,e.max);default:throw Error(`Do not know how to convert the type '${typeof e}' to a number`)}};for(const e of i.serverMetadata){const i={hostname:e.hostname,ip:u(),numOpenPortsRequired:e.numOpenPortsRequired,organizationName:e.organizationName};void 0!==e.maxRamExponent&&(i.maxRam=Math.pow(2,o(e.maxRamExponent)));for(const t of n)void 0!==e[t]&&(i[t]=o(e[t]));const s=new r.Server(i);for(const t of e.literature||[])s.messages.push(t);void 0!==e.specialName&&a.SpecialServerIps.addIp(e.specialName,s.ip),m(s),void 0!==e.networkLayer&&t[o(e.networkLayer)-1].push(s)}const l=(e,t)=>{e.serversOnNetwork.push(t.ip),t.serversOnNetwork.push(e.ip)},c=e=>e[Math.floor(Math.random()*e.length)],p=(e,t)=>{for(const n of e)l(n,t())};p(t[0],()=>e);for(let e=1;ec(t[e-1]))},t.prestigeAllServers=function(){for(const e in t.AllServers)delete t.AllServers[e];t.AllServers={}},t.loadAllServers=function(e){t.AllServers=JSON.parse(e,l.Reviver)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.EmployeePositions=void 0,t.EmployeePositions={Operations:"Operations",Engineer:"Engineer",Business:"Business",Management:"Management",RandD:"Research & Development",Training:"Training",Unassigned:"Unassigned"}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isBackdoorInstalled=t.getServerOnNetwork=t.getServer=t.GetServerByHostname=t.prestigeHomeComputer=t.processSingleServerGrowth=t.numCycleForGrowth=t.safetlyCreateUniqueServer=void 0;const r=n(27),a=n(486),i=n(516),o=n(23),s=n(9),l=n(43),c=n(145),u=n(1157),m=n(674);function p(e,t,n){let r=1+(s.CONSTANTS.ServerBaseGrowthRate-1)/e.hackDifficulty;r>s.CONSTANTS.ServerMaxGrowthRate&&(r=s.CONSTANTS.ServerMaxGrowthRate);const a=e.serverGrowth/100;return Math.log(t)/(Math.log(r)*n.hacking_grow_mult*a*o.BitNodeMultipliers.ServerGrowthRate)}function h(e){for(const t in r.AllServers)if(r.AllServers.hasOwnProperty(t)&&r.AllServers[t].hostname==e)return r.AllServers[t];return null}t.safetlyCreateUniqueServer=function(e){if(null!=e.ip&&r.ipExists(e.ip)&&(e.ip=r.createUniqueRandomIp()),null!=h(e.hostname)){let t=e.hostname;for(let n=0;n<200&&null!=h(t=`${e.hostname}-${n}`);++n);e.hostname=t}return new a.Server(e)},t.numCycleForGrowth=p,t.processSingleServerGrowth=function(e,t,n){let r=i.calculateServerGrowth(e,t,n);r<1&&(console.warn("serverGrowth calculated to be less than 1"),r=1);const a=e.moneyAvailable;if(e.moneyAvailable*=r,u.isValidNumber(e.moneyMax)&&isNaN(e.moneyAvailable)&&(e.moneyAvailable=e.moneyMax),u.isValidNumber(e.moneyMax)&&e.moneyAvailable>e.moneyMax&&(e.moneyAvailable=e.moneyMax),a!==e.moneyAvailable){let t=p(e,e.moneyAvailable/a,n);t=Math.max(0,t),e.fortify(2*s.CONSTANTS.ServerFortifyAmount*Math.ceil(t))}return e.moneyAvailable/a},t.prestigeHomeComputer=function(e){const t=e.programs.includes(l.Programs.BitFlume.name);e.programs.length=0,e.runningScripts=[],e.serversOnNetwork=[],e.isConnectedTo=!0,e.ramUsed=0,e.programs.push(l.Programs.NukeProgram.name),t&&e.programs.push(l.Programs.BitFlume.name),e.scripts.forEach(function(t){t.updateRamUsage(e.scripts)}),e.messages.length=0,e.messages.push(c.LiteratureNames.HackersStartingHandbook)},t.GetServerByHostname=h,t.getServer=function(e){return m.isValidIPAddress(e)?void 0!==r.AllServers[e]?r.AllServers[e]:null:h(e)},t.getServerOnNetwork=function(e,t){return t>e.serversOnNetwork.length?(console.error("Tried to get server on network that was out of range"),null):r.AllServers[e.serversOnNetwork[t]]},t.isBackdoorInstalled=function(e){return"backdoorInstalled"in e&&e.backdoorInstalled}},function(e,t,n){"use strict";n.d(t,"h",function(){return C}),n.d(t,"m",function(){return P}),n.d(t,"i",function(){return S}),n.d(t,"b",function(){return O}),n.d(t,"c",function(){return T}),n.d(t,"f",function(){return M}),n.d(t,"g",function(){return x}),n.d(t,"e",function(){return w}),n.d(t,"d",function(){return A}),n.d(t,"o",function(){return R}),n.d(t,"p",function(){return N}),n.d(t,"l",function(){return D}),n.d(t,"k",function(){return I}),n.d(t,"q",function(){return B}),n.d(t,"a",function(){return L}),n.d(t,"j",function(){return j}),n.d(t,"r",function(){return F}),n.d(t,"n",function(){return U});var r=n(531),a=n(161),i=n(153),o=n(38),s=n(91),l=n(179),c=n(244),u=n(178),m=n(53),p=n(1),h=n(27),d=n(29),_=n(50),g=n(16),y=n(0),f=n.n(y),b=n(26),E=n.n(b),v=n(445);let k;function C(){return 9===p.Player.bitNodeN||_.SourceFileFlags[9]>0}function P(){if(m.a.isRunning){if(m.a.currStep!==m.d.HacknetNodesIntroduction)return;Object(m.b)()}const e=p.Player.hacknetNodes.length;if(C()){const t=T();if(isNaN(t))throw new Error("Calculated cost of purchasing HacknetServer is NaN");return p.Player.canAfford(t)?(p.Player.loseMoney(t),p.Player.createHacknetServer(),F(),e):-1}{const t=O();if(isNaN(t))throw new Error("Calculated cost of purchasing HacknetNode is NaN");if(!p.Player.canAfford(t))return-1;const n="hacknet-node-"+e,a=new r.HacknetNode(n,p.Player.hacknet_node_money_mult);return p.Player.loseMoney(t),p.Player.hacknetNodes.push(a),e}}function S(){return C()&&p.Player.hacknetNodes.length>=o.HacknetServerConstants.MaxServers}function O(){return Object(a.calculateNodeCost)(p.Player.hacknetNodes.length+1,p.Player.hacknet_node_purchase_cost_mult)}function T(){return Object(i.calculateServerCost)(p.Player.hacknetNodes.length+1,p.Player.hacknet_node_purchase_cost_mult)}function M(e,t){if(null==t)throw new Error("getMaxNumberLevelUpgrades() called without maxLevel arg");if(p.Player.money.lt(e.calculateLevelUpgradeCost(1,p.Player.hacknet_node_level_cost_mult)))return 0;let n=1,r=t-1,a=t-e.level;if(p.Player.money.gt(e.calculateLevelUpgradeCost(a,p.Player.hacknet_node_level_cost_mult)))return a;for(;n<=r;){var i=(n+r)/2|0;if(i!==t&&p.Player.money.gt(e.calculateLevelUpgradeCost(i,p.Player.hacknet_node_level_cost_mult))&&p.Player.money.lt(e.calculateLevelUpgradeCost(i+1,p.Player.hacknet_node_level_cost_mult)))return Math.min(a,i);if(p.Player.money.lt(e.calculateLevelUpgradeCost(i,p.Player.hacknet_node_level_cost_mult)))r=i-1;else{if(!p.Player.money.gt(e.calculateLevelUpgradeCost(i,p.Player.hacknet_node_level_cost_mult)))return Math.min(a,i);n=i+1}}return 0}function x(e,t){if(null==t)throw new Error("getMaxNumberRamUpgrades() called without maxLevel arg");if(p.Player.money.lt(e.calculateRamUpgradeCost(1,p.Player.hacknet_node_ram_cost_mult)))return 0;let n;if(n=e instanceof s.HacknetServer?Math.round(Math.log2(t/e.maxRam)):Math.round(Math.log2(t/e.ram)),p.Player.money.gt(e.calculateRamUpgradeCost(n,p.Player.hacknet_node_ram_cost_mult)))return n;for(let t=n-1;t>=0;--t)if(p.Player.money.gt(e.calculateRamUpgradeCost(t,p.Player.hacknet_node_ram_cost_mult)))return t;return 0}function w(e,t){if(null==t)throw new Error("getMaxNumberCoreUpgrades() called without maxLevel arg");if(p.Player.money.lt(e.calculateCoreUpgradeCost(1,p.Player.hacknet_node_core_cost_mult)))return 0;let n=1,r=t-1;const a=t-e.cores;if(p.Player.money.gt(e.calculateCoreUpgradeCost(a,p.Player.hacknet_node_core_cost_mult)))return a;for(;n<=r;){let i=(n+r)/2|0;if(i!=t&&p.Player.money.gt(e.calculateCoreUpgradeCost(i,p.Player.hacknet_node_core_cost_mult))&&p.Player.money.lt(e.calculateCoreUpgradeCost(i+1,p.Player.hacknet_node_core_cost_mult)))return Math.min(a,i);if(p.Player.money.lt(e.calculateCoreUpgradeCost(i,p.Player.hacknet_node_core_cost_mult)))r=i-1;else{if(!p.Player.money.gt(e.calculateCoreUpgradeCost(i,p.Player.hacknet_node_core_cost_mult)))return Math.min(a,i);n=i+1}}return 0}function A(e,t){if(null==t)throw new Error("getMaxNumberCacheUpgrades() called without maxLevel arg");if(!p.Player.canAfford(e.calculateCacheUpgradeCost(1)))return 0;let n=1,r=t-1;const a=t-e.cache;if(p.Player.canAfford(e.calculateCacheUpgradeCost(a)))return a;for(;n<=r;){let i=(n+r)/2|0;if(i!=t&&p.Player.canAfford(e.calculateCacheUpgradeCost(i))&&!p.Player.canAfford(e.calculateCacheUpgradeCost(i+1)))return Math.min(a,i);if(p.Player.canAfford(e.calculateCacheUpgradeCost(i))){if(!p.Player.canAfford(e.calculateCacheUpgradeCost(i)))return Math.min(a,i);n=i+1}else r=i-1}return 0}function R(e,t=1){const n=Math.round(t),r=e.calculateLevelUpgradeCost(n,p.Player.hacknet_node_level_cost_mult);if(isNaN(r)||r<=0||n<0)return!1;const a=e instanceof s.HacknetServer;if(e.level>=(a?o.HacknetServerConstants.MaxLevel:o.HacknetNodeConstants.MaxLevel))return!1;if(e.level+n>(a?o.HacknetServerConstants.MaxLevel:o.HacknetNodeConstants.MaxLevel)){return R(e,Math.max(0,(a?o.HacknetServerConstants.MaxLevel:o.HacknetNodeConstants.MaxLevel)-e.level))}return!!p.Player.canAfford(r)&&(p.Player.loseMoney(r),e.upgradeLevel(n,p.Player.hacknet_node_money_mult),!0)}function N(e,t=1){const n=Math.round(t),r=e.calculateRamUpgradeCost(n,p.Player.hacknet_node_ram_cost_mult);if(isNaN(r)||r<=0||n<0)return!1;const a=e instanceof s.HacknetServer;if(e.ram>=(a?o.HacknetServerConstants.MaxRam:o.HacknetNodeConstants.MaxRam))return!1;if(a){if(e.maxRam*Math.pow(2,n)>o.HacknetServerConstants.MaxRam){return N(e,Math.max(0,Math.log2(Math.round(o.HacknetServerConstants.MaxRam/e.maxRam))))}}else if(e.ram*Math.pow(2,n)>o.HacknetNodeConstants.MaxRam){return N(e,Math.max(0,Math.log2(Math.round(o.HacknetNodeConstants.MaxRam/e.ram))))}return!!p.Player.canAfford(r)&&(p.Player.loseMoney(r),e.upgradeRam(n,p.Player.hacknet_node_money_mult),!0)}function D(e,t=1){const n=Math.round(t),r=e.calculateCoreUpgradeCost(n,p.Player.hacknet_node_core_cost_mult);if(isNaN(r)||r<=0||n<0)return!1;const a=e instanceof s.HacknetServer;if(e.cores>=(a?o.HacknetServerConstants.MaxCores:o.HacknetNodeConstants.MaxCores))return!1;if(e.cores+n>(a?o.HacknetServerConstants.MaxCores:o.HacknetNodeConstants.MaxCores)){return D(e,Math.max(0,(a?o.HacknetServerConstants.MaxCores:o.HacknetNodeConstants.MaxCores)-e.cores))}return!!p.Player.canAfford(r)&&(p.Player.loseMoney(r),e.upgradeCore(n,p.Player.hacknet_node_money_mult),!0)}function I(e,t=1){const n=Math.round(t),r=e.calculateCacheUpgradeCost(n);if(isNaN(r)||r<=0||n<0)return!1;if(!(e instanceof s.HacknetServer))return console.warn("purchaseCacheUpgrade() called for a non-HacknetNode"),!1;if(e.cache+n>o.HacknetServerConstants.MaxCache){return I(e,Math.max(0,o.HacknetServerConstants.MaxCache-e.cache))}return!!p.Player.canAfford(r)&&(p.Player.loseMoney(r),e.upgradeCache(n),!0)}function B(){g.routing.isOn(g.Page.HacknetNodes)&&E.a.render(f.a.createElement(v.a,null),k)}function L(){k instanceof HTMLElement&&E.a.unmountComponentAtNode(k),k.style.display="none"}function j(e){return 0===p.Player.hacknetNodes.length?0:C()?function(e){if(!(p.Player.hashManager instanceof l.HashManager))throw new Error("Player does not have a HashManager (should be in 'hashManager' prop)");let t=0;for(let n=0;n{!function(e){null!=t.Companies[e.name]&&console.warn(`Duplicate Company Position being defined: ${e.name}`),t.Companies[e.name]=new a.Company(e)}(e)});for(const n in t.Companies){const r=t.Companies[n];e[n]instanceof a.Company?(r.favor=e[n].favor,isNaN(r.favor)&&(r.favor=0)):r.favor=0}},t.loadCompanies=function(e){t.Companies=JSON.parse(e,i.Reviver)},t.companyExists=function(e){return t.Companies.hasOwnProperty(e)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.resetIndustryResearchTrees=t.IndustryResearchTrees=t.IndustryDescriptions=t.IndustryStartingCosts=t.Industries=void 0;const r=n(1197),a=n(2);t.Industries={Energy:"Energy",Utilities:"Water Utilities",Agriculture:"Agriculture",Fishing:"Fishing",Mining:"Mining",Food:"Food",Tobacco:"Tobacco",Chemical:"Chemical",Pharmaceutical:"Pharmaceutical",Computer:"Computer Hardware",Robotics:"Robotics",Software:"Software",Healthcare:"Healthcare",RealEstate:"RealEstate"},t.IndustryStartingCosts={Energy:225e9,Utilities:15e10,Agriculture:4e10,Fishing:8e10,Mining:3e11,Food:1e10,Tobacco:2e10,Chemical:7e10,Pharmaceutical:2e11,Computer:5e11,Robotics:1e12,Software:25e9,Healthcare:75e10,RealEstate:6e11},t.IndustryDescriptions={Energy:"Engage in the production and distribution of energy.

Starting cost: "+a.numeralWrapper.format(t.IndustryStartingCosts.Energy,"$0.000a")+"
Recommended starting Industry: NO",Utilities:"Distribute water and provide wastewater services.

Starting cost: "+a.numeralWrapper.format(t.IndustryStartingCosts.Utilities,"$0.000a")+"
Recommended starting Industry: NO",Agriculture:"Cultivate crops and breed livestock to produce food.

Starting cost: "+a.numeralWrapper.format(t.IndustryStartingCosts.Agriculture,"$0.000a")+"
Recommended starting Industry: YES",Fishing:"Produce food through the breeding and processing of fish and fish products.

Starting cost: "+a.numeralWrapper.format(t.IndustryStartingCosts.Fishing,"$0.000a")+"
Recommended starting Industry: NO",Mining:"Extract and process metals from the earth.

Starting cost: "+a.numeralWrapper.format(t.IndustryStartingCosts.Mining,"$0.000a")+"
Recommended starting Industry: NO",Food:"Create your own restaurants all around the world.

Starting cost: "+a.numeralWrapper.format(t.IndustryStartingCosts.Food,"$0.000a")+"
Recommended starting Industry: YES",Tobacco:"Create and distribute tobacco and tobacco-related products.

Starting cost: "+a.numeralWrapper.format(t.IndustryStartingCosts.Tobacco,"$0.000a")+"
Recommended starting Industry: YES",Chemical:"Produce industrial chemicals.

Starting cost: "+a.numeralWrapper.format(t.IndustryStartingCosts.Chemical,"$0.000a")+"
Recommended starting Industry: NO",Pharmaceutical:"Discover, develop, and create new pharmaceutical drugs.

Starting cost: "+a.numeralWrapper.format(t.IndustryStartingCosts.Pharmaceutical,"$0.000a")+"
Recommended starting Industry: NO",Computer:"Develop and manufacture new computer hardware and networking infrastructures.

Starting cost: "+a.numeralWrapper.format(t.IndustryStartingCosts.Computer,"$0.000a")+"
Recommended starting Industry: NO",Robotics:"Develop and create robots.

Starting cost: "+a.numeralWrapper.format(t.IndustryStartingCosts.Robotics,"$0.000a")+"
Recommended starting Industry: NO",Software:"Develop computer software and create AI Cores.

Starting cost: "+a.numeralWrapper.format(t.IndustryStartingCosts.Software,"$0.000a")+"
Recommended starting Industry: YES",Healthcare:"Create and manage hospitals.

Starting cost: "+a.numeralWrapper.format(t.IndustryStartingCosts.Healthcare,"$0.000a")+"
Recommended starting Industry: NO",RealEstate:"Develop and manage real estate properties.

Starting cost: "+a.numeralWrapper.format(t.IndustryStartingCosts.RealEstate,"$0.000a")+"
Recommended starting Industry: NO"},t.IndustryResearchTrees={Energy:r.getBaseResearchTreeCopy(),Utilities:r.getBaseResearchTreeCopy(),Agriculture:r.getBaseResearchTreeCopy(),Fishing:r.getBaseResearchTreeCopy(),Mining:r.getBaseResearchTreeCopy(),Food:r.getProductIndustryResearchTreeCopy(),Tobacco:r.getProductIndustryResearchTreeCopy(),Chemical:r.getBaseResearchTreeCopy(),Pharmaceutical:r.getProductIndustryResearchTreeCopy(),Computer:r.getProductIndustryResearchTreeCopy(),Robotics:r.getProductIndustryResearchTreeCopy(),Software:r.getProductIndustryResearchTreeCopy(),Healthcare:r.getProductIndustryResearchTreeCopy(),RealEstate:r.getProductIndustryResearchTreeCopy()},t.resetIndustryResearchTrees=function(){t.IndustryResearchTrees.Energy=r.getBaseResearchTreeCopy(),t.IndustryResearchTrees.Utilities=r.getBaseResearchTreeCopy(),t.IndustryResearchTrees.Agriculture=r.getBaseResearchTreeCopy(),t.IndustryResearchTrees.Fishing=r.getBaseResearchTreeCopy(),t.IndustryResearchTrees.Mining=r.getBaseResearchTreeCopy(),t.IndustryResearchTrees.Food=r.getBaseResearchTreeCopy(),t.IndustryResearchTrees.Tobacco=r.getBaseResearchTreeCopy(),t.IndustryResearchTrees.Chemical=r.getBaseResearchTreeCopy(),t.IndustryResearchTrees.Pharmaceutical=r.getBaseResearchTreeCopy(),t.IndustryResearchTrees.Computer=r.getBaseResearchTreeCopy(),t.IndustryResearchTrees.Robotics=r.getBaseResearchTreeCopy(),t.IndustryResearchTrees.Software=r.getBaseResearchTreeCopy(),t.IndustryResearchTrees.Healthcare=r.getBaseResearchTreeCopy(),t.IndustryResearchTrees.RealEstate=r.getBaseResearchTreeCopy()}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.HacknetServerConstants=t.HacknetNodeConstants=void 0,t.HacknetNodeConstants={MoneyGainPerLevel:1.6,BaseCost:1e3,LevelBaseCost:1,RamBaseCost:3e4,CoreBaseCost:5e5,PurchaseNextMult:1.85,UpgradeLevelMult:1.04,UpgradeRamMult:1.28,UpgradeCoreMult:1.48,MaxLevel:200,MaxRam:64,MaxCores:16},t.HacknetServerConstants={HashesPerLevel:.001,BaseCost:5e4,RamBaseCost:2e5,CoreBaseCost:1e6,CacheBaseCost:1e7,PurchaseMult:3.2,UpgradeLevelMult:1.1,UpgradeRamMult:1.4,UpgradeCoreMult:1.55,UpgradeCacheMult:1.85,MaxServers:20,MaxLevel:300,MaxRam:8192,MaxCores:128,MaxCache:15}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.initializeMainMenuLinks=t.MainMenuLinks=void 0;const r=n(35),a=(()=>{const e=document.createElement("div");if(null===e)throw new Error("unable to create empty div element");return e})();t.MainMenuLinks={Terminal:a,ScriptEditor:a,ActiveScripts:a,CreateProgram:a,Stats:a,Factions:a,Augmentations:a,HacknetNodes:a,Sleeves:a,City:a,Travel:a,Job:a,StockMarket:a,Bladeburner:a,Corporation:a,Gang:a,Milestones:a,Tutorial:a,Options:a,DevMenu:a},t.initializeMainMenuLinks=function(){try{function e(e){const t=r.clearEventListeners(e);if(null==t)throw new Error(`clearEventListeners() failed for element with id: ${e}`);return t}t.MainMenuLinks.Terminal=e("terminal-menu-link"),t.MainMenuLinks.ScriptEditor=e("create-script-menu-link"),t.MainMenuLinks.ActiveScripts=e("active-scripts-menu-link"),t.MainMenuLinks.CreateProgram=e("create-program-menu-link"),t.MainMenuLinks.Stats=e("stats-menu-link"),t.MainMenuLinks.Factions=e("factions-menu-link"),t.MainMenuLinks.Augmentations=e("augmentations-menu-link"),t.MainMenuLinks.HacknetNodes=e("hacknet-nodes-menu-link"),t.MainMenuLinks.Sleeves=e("sleeves-menu-link"),t.MainMenuLinks.City=e("city-menu-link"),t.MainMenuLinks.Travel=e("travel-menu-link"),t.MainMenuLinks.Job=e("job-menu-link"),t.MainMenuLinks.StockMarket=e("stock-market-menu-link"),t.MainMenuLinks.Bladeburner=e("bladeburner-menu-link"),t.MainMenuLinks.Corporation=e("corporation-menu-link"),t.MainMenuLinks.Gang=e("gang-menu-link"),t.MainMenuLinks.Milestones=e("milestones-menu-link"),t.MainMenuLinks.Tutorial=e("tutorial-menu-link");const n=document.getElementById("options-menu-link");if(null===n)throw new Error('Could not find element with id: "options-menu-link"');return t.MainMenuLinks.Options=n,t.MainMenuLinks.DevMenu=e("dev-menu-link"),!0}catch(e){return console.error(`Failed to initialize Main Menu Links: ${e}`),!1}}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CityName=void 0,function(e){e.Aevum="Aevum",e.Chongqing="Chongqing",e.Ishima="Ishima",e.NewTokyo="New Tokyo",e.Sector12="Sector-12",e.Volhaven="Volhaven"}(t.CityName||(t.CityName={}))},,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Programs=void 0;const r=n(1161),a=n(1160);t.Programs={};for(const e of a.programsMetadata)t.Programs[e.key]=new r.Program(e.name,e.create)},function(module,__webpack_exports__,__webpack_require__){"use strict";(function($){__webpack_require__.d(__webpack_exports__,"f",function(){return IssueNewSharesCooldown}),__webpack_require__.d(__webpack_exports__,"k",function(){return SellSharesCooldown}),__webpack_require__.d(__webpack_exports__,"m",function(){return WarehouseInitialCost}),__webpack_require__.d(__webpack_exports__,"n",function(){return WarehouseInitialSize}),__webpack_require__.d(__webpack_exports__,"o",function(){return WarehouseUpgradeBaseCost}),__webpack_require__.d(__webpack_exports__,"g",function(){return OfficeInitialCost}),__webpack_require__.d(__webpack_exports__,"h",function(){return OfficeInitialSize}),__webpack_require__.d(__webpack_exports__,"a",function(){return BribeThreshold}),__webpack_require__.d(__webpack_exports__,"b",function(){return BribeToRepRatio}),__webpack_require__.d(__webpack_exports__,"j",function(){return ProductProductionCostRatio}),__webpack_require__.d(__webpack_exports__,"d",function(){return DividendMaxPercentage}),__webpack_require__.d(__webpack_exports__,"c",function(){return Corporation}),__webpack_require__.d(__webpack_exports__,"e",function(){return Industry}),__webpack_require__.d(__webpack_exports__,"i",function(){return OfficeSpace});var _CorporationState__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(532),_CorporationState__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(_CorporationState__WEBPACK_IMPORTED_MODULE_0__),_data_CorporationUnlockUpgrades__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(450),_data_CorporationUnlockUpgrades__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(_data_CorporationUnlockUpgrades__WEBPACK_IMPORTED_MODULE_1__),_data_CorporationUpgrades__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(449),_data_CorporationUpgrades__WEBPACK_IMPORTED_MODULE_2___default=__webpack_require__.n(_data_CorporationUpgrades__WEBPACK_IMPORTED_MODULE_2__),_EmployeePositions__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(28),_EmployeePositions__WEBPACK_IMPORTED_MODULE_3___default=__webpack_require__.n(_EmployeePositions__WEBPACK_IMPORTED_MODULE_3__),_IndustryData__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(37),_IndustryData__WEBPACK_IMPORTED_MODULE_4___default=__webpack_require__.n(_IndustryData__WEBPACK_IMPORTED_MODULE_4__),_IndustryUpgrades__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(304),_IndustryUpgrades__WEBPACK_IMPORTED_MODULE_5___default=__webpack_require__.n(_IndustryUpgrades__WEBPACK_IMPORTED_MODULE_5__),_Material__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(290),_Material__WEBPACK_IMPORTED_MODULE_6___default=__webpack_require__.n(_Material__WEBPACK_IMPORTED_MODULE_6__),_MaterialSizes__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__(141),_MaterialSizes__WEBPACK_IMPORTED_MODULE_7___default=__webpack_require__.n(_MaterialSizes__WEBPACK_IMPORTED_MODULE_7__),_Product__WEBPACK_IMPORTED_MODULE_8__=__webpack_require__(205),_Product__WEBPACK_IMPORTED_MODULE_8___default=__webpack_require__.n(_Product__WEBPACK_IMPORTED_MODULE_8__),_ResearchMap__WEBPACK_IMPORTED_MODULE_9__=__webpack_require__(408),_ResearchMap__WEBPACK_IMPORTED_MODULE_9___default=__webpack_require__.n(_ResearchMap__WEBPACK_IMPORTED_MODULE_9__),_Warehouse__WEBPACK_IMPORTED_MODULE_10__=__webpack_require__(127),_Warehouse__WEBPACK_IMPORTED_MODULE_10___default=__webpack_require__.n(_Warehouse__WEBPACK_IMPORTED_MODULE_10__);__webpack_require__.d(__webpack_exports__,"l",function(){return _Warehouse__WEBPACK_IMPORTED_MODULE_10__.Warehouse});var _BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_11__=__webpack_require__(23),_BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_11___default=__webpack_require__.n(_BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_11__),_Literature_LiteratureHelpers__WEBPACK_IMPORTED_MODULE_12__=__webpack_require__(448),_Literature_LiteratureHelpers__WEBPACK_IMPORTED_MODULE_12___default=__webpack_require__.n(_Literature_LiteratureHelpers__WEBPACK_IMPORTED_MODULE_12__),_Literature_data_LiteratureNames__WEBPACK_IMPORTED_MODULE_13__=__webpack_require__(145),_Literature_data_LiteratureNames__WEBPACK_IMPORTED_MODULE_13___default=__webpack_require__.n(_Literature_data_LiteratureNames__WEBPACK_IMPORTED_MODULE_13__),_Locations_data_CityNames__WEBPACK_IMPORTED_MODULE_14__=__webpack_require__(40),_Locations_data_CityNames__WEBPACK_IMPORTED_MODULE_14___default=__webpack_require__.n(_Locations_data_CityNames__WEBPACK_IMPORTED_MODULE_14__),_Player__WEBPACK_IMPORTED_MODULE_15__=__webpack_require__(1),_ui_numeralFormat__WEBPACK_IMPORTED_MODULE_16__=__webpack_require__(2),_ui_numeralFormat__WEBPACK_IMPORTED_MODULE_16___default=__webpack_require__.n(_ui_numeralFormat__WEBPACK_IMPORTED_MODULE_16__),_ui_navigationTracking__WEBPACK_IMPORTED_MODULE_17__=__webpack_require__(16),_ui_navigationTracking__WEBPACK_IMPORTED_MODULE_17___default=__webpack_require__.n(_ui_navigationTracking__WEBPACK_IMPORTED_MODULE_17__),_utils_calculateEffectWithFactors__WEBPACK_IMPORTED_MODULE_18__=__webpack_require__(779),_utils_calculateEffectWithFactors__WEBPACK_IMPORTED_MODULE_18___default=__webpack_require__.n(_utils_calculateEffectWithFactors__WEBPACK_IMPORTED_MODULE_18__),_utils_DialogBox__WEBPACK_IMPORTED_MODULE_19__=__webpack_require__(12),_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_20__=__webpack_require__(25),_utils_uiHelpers_appendLineBreaks__WEBPACK_IMPORTED_MODULE_21__=__webpack_require__(107),_utils_uiHelpers_appendLineBreaks__WEBPACK_IMPORTED_MODULE_21___default=__webpack_require__.n(_utils_uiHelpers_appendLineBreaks__WEBPACK_IMPORTED_MODULE_21__),_utils_uiHelpers_createElement__WEBPACK_IMPORTED_MODULE_22__=__webpack_require__(5),_utils_uiHelpers_createElement__WEBPACK_IMPORTED_MODULE_22___default=__webpack_require__.n(_utils_uiHelpers_createElement__WEBPACK_IMPORTED_MODULE_22__),_utils_uiHelpers_createPopup__WEBPACK_IMPORTED_MODULE_23__=__webpack_require__(52),_utils_uiHelpers_createPopup__WEBPACK_IMPORTED_MODULE_23___default=__webpack_require__.n(_utils_uiHelpers_createPopup__WEBPACK_IMPORTED_MODULE_23__),_utils_uiHelpers_createPopupCloseButton__WEBPACK_IMPORTED_MODULE_24__=__webpack_require__(73),_utils_uiHelpers_createPopupCloseButton__WEBPACK_IMPORTED_MODULE_24___default=__webpack_require__.n(_utils_uiHelpers_createPopupCloseButton__WEBPACK_IMPORTED_MODULE_24__),_utils_StringHelperFunctions__WEBPACK_IMPORTED_MODULE_25__=__webpack_require__(13),_utils_StringHelperFunctions__WEBPACK_IMPORTED_MODULE_25___default=__webpack_require__.n(_utils_StringHelperFunctions__WEBPACK_IMPORTED_MODULE_25__),_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_26__=__webpack_require__(22),_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_26___default=__webpack_require__.n(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_26__),_utils_helpers_isString__WEBPACK_IMPORTED_MODULE_27__=__webpack_require__(65),_utils_helpers_isString__WEBPACK_IMPORTED_MODULE_27___default=__webpack_require__.n(_utils_helpers_isString__WEBPACK_IMPORTED_MODULE_27__),_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_28__=__webpack_require__(34),_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_28___default=__webpack_require__.n(_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_28__),_utils_uiHelpers_removeElement__WEBPACK_IMPORTED_MODULE_29__=__webpack_require__(110),_utils_uiHelpers_removeElement__WEBPACK_IMPORTED_MODULE_29___default=__webpack_require__.n(_utils_uiHelpers_removeElement__WEBPACK_IMPORTED_MODULE_29__),_utils_uiHelpers_removeElementById__WEBPACK_IMPORTED_MODULE_30__=__webpack_require__(45),_utils_uiHelpers_removeElementById__WEBPACK_IMPORTED_MODULE_30___default=__webpack_require__.n(_utils_uiHelpers_removeElementById__WEBPACK_IMPORTED_MODULE_30__),_utils_YesNoBox__WEBPACK_IMPORTED_MODULE_31__=__webpack_require__(58),_utils_YesNoBox__WEBPACK_IMPORTED_MODULE_31___default=__webpack_require__.n(_utils_YesNoBox__WEBPACK_IMPORTED_MODULE_31__),react__WEBPACK_IMPORTED_MODULE_32__=__webpack_require__(0),react__WEBPACK_IMPORTED_MODULE_32___default=__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_32__),react_dom__WEBPACK_IMPORTED_MODULE_33__=__webpack_require__(26),react_dom__WEBPACK_IMPORTED_MODULE_33___default=__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_33__),_ui_CorporationUIEventHandler__WEBPACK_IMPORTED_MODULE_34__=__webpack_require__(778),_ui_Root__WEBPACK_IMPORTED_MODULE_35__=__webpack_require__(776),_ui_Routing__WEBPACK_IMPORTED_MODULE_36__=__webpack_require__(447),_ui_Routing__WEBPACK_IMPORTED_MODULE_36___default=__webpack_require__.n(_ui_Routing__WEBPACK_IMPORTED_MODULE_36__),decimal_js__WEBPACK_IMPORTED_MODULE_37__=__webpack_require__(59);const INITIALSHARES=1e9,SHARESPERPRICEUPDATE=1e6,IssueNewSharesCooldown=216e3,SellSharesCooldown=18e3,CyclesPerMarketCycle=50,CyclesPerIndustryStateCycle=CyclesPerMarketCycle/_CorporationState__WEBPACK_IMPORTED_MODULE_0__.AllCorporationStates.length,SecsPerMarketCycle=CyclesPerMarketCycle/5,Cities=["Aevum","Chongqing","Sector-12","New Tokyo","Ishima","Volhaven"],WarehouseInitialCost=5e9,WarehouseInitialSize=100,WarehouseUpgradeBaseCost=1e9,OfficeInitialCost=4e9,OfficeInitialSize=3,OfficeUpgradeBaseCost=1e9,BribeThreshold=1e14,BribeToRepRatio=1e9,ProductProductionCostRatio=5,DividendMaxPercentage=50,EmployeeSalaryMultiplier=3,CyclesPerEmployeeRaise=400,EmployeeRaiseAmount=50,BaseMaxProducts=3;let researchTreeBoxOpened=!1,researchTreeBox=null;function Industry(e={}){this.offices={[_Locations_data_CityNames__WEBPACK_IMPORTED_MODULE_14__.CityName.Aevum]:0,[_Locations_data_CityNames__WEBPACK_IMPORTED_MODULE_14__.CityName.Chongqing]:0,[_Locations_data_CityNames__WEBPACK_IMPORTED_MODULE_14__.CityName.Sector12]:new OfficeSpace({loc:_Locations_data_CityNames__WEBPACK_IMPORTED_MODULE_14__.CityName.Sector12,size:OfficeInitialSize}),[_Locations_data_CityNames__WEBPACK_IMPORTED_MODULE_14__.CityName.NewTokyo]:0,[_Locations_data_CityNames__WEBPACK_IMPORTED_MODULE_14__.CityName.Ishima]:0,[_Locations_data_CityNames__WEBPACK_IMPORTED_MODULE_14__.CityName.Volhaven]:0},this.name=e.name?e.name:0,this.type=e.type?e.type:0,this.sciResearch=new _Material__WEBPACK_IMPORTED_MODULE_6__.Material({name:"Scientific Research"}),this.researched={},this.reqMats={},this.prodMats=[],this.products={},this.makesProducts=!1,this.awareness=0,this.popularity=0,this.startingCost=0,this.reFac=0,this.sciFac=0,this.hwFac=0,this.robFac=0,this.aiFac=0,this.advFac=0,this.prodMult=0,this.lastCycleRevenue=new decimal_js__WEBPACK_IMPORTED_MODULE_37__.a(0),this.lastCycleExpenses=new decimal_js__WEBPACK_IMPORTED_MODULE_37__.a(0),this.thisCycleRevenue=new decimal_js__WEBPACK_IMPORTED_MODULE_37__.a(0),this.thisCycleExpenses=new decimal_js__WEBPACK_IMPORTED_MODULE_37__.a(0);var t=Object.keys(_IndustryUpgrades__WEBPACK_IMPORTED_MODULE_5__.IndustryUpgrades).length;this.upgrades=Array(t).fill(0),this.state="START",this.newInd=!0,this.warehouses={[_Locations_data_CityNames__WEBPACK_IMPORTED_MODULE_14__.CityName.Aevum]:0,[_Locations_data_CityNames__WEBPACK_IMPORTED_MODULE_14__.CityName.Chonqing]:0,[_Locations_data_CityNames__WEBPACK_IMPORTED_MODULE_14__.CityName.Sector12]:new _Warehouse__WEBPACK_IMPORTED_MODULE_10__.Warehouse({corp:e.corp,industry:this,loc:_Locations_data_CityNames__WEBPACK_IMPORTED_MODULE_14__.CityName.Sector12,size:WarehouseInitialSize}),[_Locations_data_CityNames__WEBPACK_IMPORTED_MODULE_14__.CityName.NewTokyo]:0,[_Locations_data_CityNames__WEBPACK_IMPORTED_MODULE_14__.CityName.Ishima]:0,[_Locations_data_CityNames__WEBPACK_IMPORTED_MODULE_14__.CityName.Volhaven]:0},this.init()}function Employee(e={}){if(!(this instanceof Employee))return new Employee(e);this.name=e.name?e.name:"Bobby",this.mor=e.morale?e.morale:Object(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_26__.getRandomInt)(50,100),this.hap=e.happiness?e.happiness:Object(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_26__.getRandomInt)(50,100),this.ene=e.energy?e.energy:Object(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_26__.getRandomInt)(50,100),this.int=e.intelligence?e.intelligence:Object(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_26__.getRandomInt)(10,50),this.cha=e.charisma?e.charisma:Object(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_26__.getRandomInt)(10,50),this.exp=e.experience?e.experience:Object(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_26__.getRandomInt)(10,50),this.cre=e.creativity?e.creativity:Object(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_26__.getRandomInt)(10,50),this.eff=e.efficiency?e.efficiency:Object(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_26__.getRandomInt)(10,50),this.sal=e.salary?e.salary:Object(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_26__.getRandomInt)(.1,5),this.pro=0,this.cyclesUntilRaise=CyclesPerEmployeeRaise,this.loc=e.loc?e.loc:"",this.pos=_EmployeePositions__WEBPACK_IMPORTED_MODULE_3__.EmployeePositions.Unassigned}$(document).mousedown(function(e){researchTreeBoxOpened&&null==$(e.target).closest("#corporation-research-popup-box-content").get(0)&&(Object(_utils_uiHelpers_removeElement__WEBPACK_IMPORTED_MODULE_29__.removeElement)(researchTreeBox),researchTreeBox=null,researchTreeBoxOpened=!1)}),Industry.prototype.init=function(){switch(this.startingCost=_IndustryData__WEBPACK_IMPORTED_MODULE_4__.IndustryStartingCosts[this.type],this.type){case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Energy:this.reFac=.65,this.sciFac=.7,this.robFac=.05,this.aiFac=.3,this.advFac=.08,this.reqMats={Hardware:.1,Metal:.2},this.prodMats=["Energy"];break;case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Utilities:case"Utilities":this.reFac=.5,this.sciFac=.6,this.robFac=.4,this.aiFac=.4,this.advFac=.08,this.reqMats={Hardware:.1,Metal:.1},this.prodMats=["Water"];break;case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Agriculture:this.reFac=.72,this.sciFac=.5,this.hwFac=.2,this.robFac=.3,this.aiFac=.3,this.advFac=.04,this.reqMats={Water:.5,Energy:.5},this.prodMats=["Plants","Food"];break;case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Fishing:this.reFac=.15,this.sciFac=.35,this.hwFac=.35,this.robFac=.5,this.aiFac=.2,this.advFac=.08,this.reqMats={Energy:.5},this.prodMats=["Food"];break;case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Mining:this.reFac=.3,this.sciFac=.26,this.hwFac=.4,this.robFac=.45,this.aiFac=.45,this.advFac=.06,this.reqMats={Energy:.8},this.prodMats=["Metal"];break;case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Food:this.sciFac=.12,this.hwFac=.15,this.robFac=.3,this.aiFac=.25,this.advFac=.25,this.reFac=.05,this.reqMats={Food:.5,Water:.5,Energy:.2},this.makesProducts=!0;break;case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Tobacco:this.reFac=.15,this.sciFac=.75,this.hwFac=.15,this.robFac=.2,this.aiFac=.15,this.advFac=.2,this.reqMats={Plants:1,Water:.2},this.makesProducts=!0;break;case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Chemical:this.reFac=.25,this.sciFac=.75,this.hwFac=.2,this.robFac=.25,this.aiFac=.2,this.advFac=.07,this.reqMats={Plants:1,Energy:.5,Water:.5},this.prodMats=["Chemicals"];break;case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Pharmaceutical:this.reFac=.05,this.sciFac=.8,this.hwFac=.15,this.robFac=.25,this.aiFac=.2,this.advFac=.16,this.reqMats={Chemicals:2,Energy:1,Water:.5},this.prodMats=["Drugs"],this.makesProducts=!0;break;case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Computer:case"Computer":this.reFac=.2,this.sciFac=.62,this.robFac=.36,this.aiFac=.19,this.advFac=.17,this.reqMats={Metal:2,Energy:1},this.prodMats=["Hardware"],this.makesProducts=!0;break;case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Robotics:this.reFac=.32,this.sciFac=.65,this.aiFac=.36,this.advFac=.18,this.hwFac=.19,this.reqMats={Hardware:5,Energy:3},this.prodMats=["Robots"],this.makesProducts=!0;break;case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Software:this.sciFac=.62,this.advFac=.16,this.hwFac=.25,this.reFac=.15,this.aiFac=.18,this.robFac=.05,this.reqMats={Hardware:.5,Energy:.5},this.prodMats=["AICores"],this.makesProducts=!0;break;case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Healthcare:this.reFac=.1,this.sciFac=.75,this.advFac=.11,this.hwFac=.1,this.robFac=.1,this.aiFac=.1,this.reqMats={Robots:10,AICores:5,Energy:5,Water:5},this.makesProducts=!0;break;case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.RealEstate:this.robFac=.6,this.aiFac=.6,this.advFac=.25,this.sciFac=.05,this.hwFac=.05,this.reqMats={Metal:5,Energy:5,Water:2,Hardware:4},this.prodMats=["RealEstate"],this.makesProducts=!0;break;default:return void console.error(`Invalid Industry Type passed into Industry.init(): ${this.type}`)}},Industry.prototype.getProductDescriptionText=function(){if(this.makesProducts)switch(this.type){case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Food:return"create and manage restaurants";case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Tobacco:return"create tobacco and tobacco-related products";case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Pharmaceutical:return"develop new pharmaceutical drugs";case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Computer:case"Computer":return"create new computer hardware and networking infrastructures";case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Robotics:return"build specialized robots and robot-related products";case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Software:return"develop computer software";case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.Healthcare:return"build and manage hospitals";case _IndustryData__WEBPACK_IMPORTED_MODULE_4__.Industries.RealEstate:return"develop and manage real estate properties";default:return console.error("Invalid industry type in Industry.getProductDescriptionText"),""}},Industry.prototype.getMaximumNumberProducts=function(){if(!this.makesProducts)return 0;let e=0;return this.hasResearch("uPgrade: Capacity.I")&&++e,this.hasResearch("uPgrade: Capacity.II")&&++e,BaseMaxProducts+e},Industry.prototype.hasMaximumNumberProducts=function(){return Object.keys(this.products).length>=this.getMaximumNumberProducts()},Industry.prototype.calculateProductionFactors=function(){for(var e=0,t=0;t0&&(e.breakdown+=t+": "+Object(_utils_StringHelperFunctions__WEBPACK_IMPORTED_MODULE_25__.formatNumber)(n.data[e.loc][0]*n.siz,0)+"
")}},Industry.prototype.process=function(e=1,t,n){if(this.state=t,"START"===t){(isNaN(this.thisCycleRevenue)||isNaN(this.thisCycleExpenses))&&(console.error("NaN in Corporation's computed revenue/expenses"),Object(_utils_DialogBox__WEBPACK_IMPORTED_MODULE_19__.dialogBoxCreate)("Something went wrong when compting Corporation's revenue/expenses. This is a bug. Please report to game developer"),this.thisCycleRevenue=new decimal_js__WEBPACK_IMPORTED_MODULE_37__.a(0),this.thisCycleExpenses=new decimal_js__WEBPACK_IMPORTED_MODULE_37__.a(0)),this.lastCycleRevenue=this.thisCycleRevenue.dividedBy(e*SecsPerMarketCycle),this.lastCycleExpenses=this.thisCycleExpenses.dividedBy(e*SecsPerMarketCycle),this.thisCycleRevenue=new decimal_js__WEBPACK_IMPORTED_MODULE_37__.a(0),this.thisCycleExpenses=new decimal_js__WEBPACK_IMPORTED_MODULE_37__.a(0),this.lastCycleRevenue.gt(0)&&(this.newInd=!1);var r=0;for(var a in this.offices)this.offices[a]instanceof OfficeSpace&&(r+=this.offices[a].process(e,{industry:this,corporation:n}));this.thisCycleExpenses=this.thisCycleExpenses.plus(r),this.processMaterialMarket(e),this.processProductMarket(e),this.popularity-=1e-4*e,this.popularity=Math.max(0,this.popularity);var i=n.getDreamSenseGain(),o=4*i;return void(i>0&&(this.popularity+=i*e,this.awareness+=o*e))}let s=this.processMaterials(e,n);Array.isArray(s)&&(this.thisCycleRevenue=this.thisCycleRevenue.plus(s[0]),this.thisCycleExpenses=this.thisCycleExpenses.plus(s[1])),s=this.processProducts(e,n),Array.isArray(s)&&(this.thisCycleRevenue=this.thisCycleRevenue.plus(s[0]),this.thisCycleExpenses=this.thisCycleExpenses.plus(s[1]))},Industry.prototype.processMaterialMarket=function(){for(var e=this.reqMats,t=this.prodMats,n=0;n0&&(a.qty+=r,expenses+=r*a.bCost)}(matName,this),this.updateWarehouseSizeUsed(warehouse));break;case"PRODUCTION":if(warehouse.smartSupplyStore=0,this.prodMats.length>0){var mat=warehouse.materials[this.prodMats[0]],maxProd=this.getOfficeProductivity(office)*this.prodMult*company.getProductionMultiplier()*this.getProductionMultiplier();let e;e=mat.prdman[0]?Math.min(maxProd,mat.prdman[1]):maxProd,e*=SecsPerMarketCycle*marketCycles;var totalMatSize=0;for(let e=0;e0){var maxAmt=Math.floor((warehouse.size-warehouse.sizeUsed)/totalMatSize);e=Math.min(maxAmt,e)}e<0&&(e=0),warehouse.smartSupplyStore+=e/(SecsPerMarketCycle*marketCycles);var producableFrac=1;for(var reqMatName in this.reqMats)if(this.reqMats.hasOwnProperty(reqMatName)){var req=this.reqMats[reqMatName]*e;warehouse.materials[reqMatName].qty0&&e>0){for(const t in this.reqMats){var reqMatQtyNeeded=this.reqMats[t]*e*producableFrac;warehouse.materials[t].qty-=reqMatQtyNeeded,warehouse.materials[t].prd=0,warehouse.materials[t].prd-=reqMatQtyNeeded/(SecsPerMarketCycle*marketCycles)}for(let t=0;tmat.bCost?sCost-mat.bCost>markupLimit&&(markup=Math.pow(markupLimit/(sCost-mat.bCost),2)):sCost=0?(mat.qty-=sellAmt,revenue+=sellAmt*sCost,mat.sll=sellAmt/(SecsPerMarketCycle*marketCycles)):mat.sll=0}break;case"EXPORT":for(var matName in warehouse.materials)if(warehouse.materials.hasOwnProperty(matName)){var mat=warehouse.materials[matName];mat.totalExp=0;for(var expI=0;expI=expWarehouse.size)return[0,0];var maxAmt=Math.floor((expWarehouse.size-expWarehouse.sizeUsed)/_MaterialSizes__WEBPACK_IMPORTED_MODULE_7__.MaterialSizes[matName]);amt=Math.min(maxAmt,amt),expWarehouse.materials[matName].imp+=amt/(SecsPerMarketCycle*marketCycles),expWarehouse.materials[matName].qty+=amt,expWarehouse.materials[matName].qlt=mat.qlt,mat.qty-=amt,mat.totalExp+=amt,expIndustry.updateWarehouseSizeUsed(expWarehouse);break}}}mat.totalExp/=SecsPerMarketCycle*marketCycles}break;case"START":break;default:console.error(`Invalid state: ${this.state}`)}this.updateWarehouseSizeUsed(warehouse)}office instanceof OfficeSpace&&(this.sciResearch.qty+=.004*Math.pow(office.employeeProd[_EmployeePositions__WEBPACK_IMPORTED_MODULE_3__.EmployeePositions.RandD],.5)*company.getScientificResearchMultiplier()*this.getScientificResearchMultiplier())}return[revenue,expenses]},Industry.prototype.processProducts=function(e=1,t){var n=0;if("PRODUCTION"===this.state)for(const t in this.products){const n=this.products[t];if(!n.fin){const t=n.createCity,r=this.offices[t],a=r.employeeProd[_EmployeePositions__WEBPACK_IMPORTED_MODULE_3__.EmployeePositions.Engineer],i=r.employeeProd[_EmployeePositions__WEBPACK_IMPORTED_MODULE_3__.EmployeePositions.Management],o=r.employeeProd[_EmployeePositions__WEBPACK_IMPORTED_MODULE_3__.EmployeePositions.Operations],s=a+i+o;if(s<=0)break;const l=1+i/(1.2*s),c=(Math.pow(a,.34)+Math.pow(o,.2))*l;n.createProduct(e,c),n.prog>=100&&n.finishProduct(r.employeeProd,this);break}}for(var r in this.products)if(this.products.hasOwnProperty(r)){var a=this.products[r];a instanceof _Product__WEBPACK_IMPORTED_MODULE_8__.Product&&a.fin&&(n+=this.processProduct(e,a,t))}return[n,0]},Industry.prototype.processProduct=function(marketCycles=1,product,corporation){let totalProfit=0;for(let i=0;i0){var maxAmt=Math.floor((warehouse.size-warehouse.sizeUsed)/netStorageSize);e=Math.min(maxAmt,e)}warehouse.smartSupplyStore+=e/(SecsPerMarketCycle*marketCycles);var producableFrac=1;for(var reqMatName in product.reqMats)if(product.reqMats.hasOwnProperty(reqMatName)){var req=product.reqMats[reqMatName]*e;warehouse.materials[reqMatName].qty0&&e>0){for(var reqMatName in product.reqMats)if(product.reqMats.hasOwnProperty(reqMatName)){var reqMatQtyNeeded=product.reqMats[reqMatName]*e*producableFrac;warehouse.materials[reqMatName].qty-=reqMatQtyNeeded,warehouse.materials[reqMatName].prd-=reqMatQtyNeeded/(SecsPerMarketCycle*marketCycles)}product.data[city][0]+=e*producableFrac}product.data[city][1]=e*producableFrac/(SecsPerMarketCycle*marketCycles);break}case"SALE":{for(var reqMatName in product.pCost=0,product.reqMats)product.reqMats.hasOwnProperty(reqMatName)&&(product.pCost+=product.reqMats[reqMatName]*warehouse.materials[reqMatName].bCost);product.pCost*=ProductProductionCostRatio;const businessFactor=this.getBusinessFactor(office),advertisingFactor=this.getAdvertisingFactors()[0],marketFactor=this.getMarketFactor(product),markupLimit=product.rat/product.mku;var sCost;if(product.marketTa2){const e=product.data[city][1],t=markupLimit,n=e,r=.5*Math.pow(product.rat,.65)*marketFactor*corporation.getSalesMultiplier()*businessFactor*advertisingFactor*this.getSalesMultiplier(),a=Math.sqrt(n/r);let i;0===r||0===a?0===n?i=0:(i=product.pCost+markupLimit,console.warn("In Corporation, found illegal 0s when trying to calculate MarketTA2 sale cost")):i=t/a+product.pCost,product.marketTa2Price[city]=i,sCost=i}else product.marketTa1?sCost=product.pCost+markupLimit:Object(_utils_helpers_isString__WEBPACK_IMPORTED_MODULE_27__.isString)(product.sCost)?(sCost=product.sCost.replace(/MP/g,product.pCost+product.rat/product.mku),sCost=eval(sCost)):sCost=product.sCost;var markup=1;sCost>product.pCost&&sCost-product.pCost>markupLimit&&(markup=markupLimit/(sCost-product.pCost));var maxSell=.5*Math.pow(product.rat,.65)*marketFactor*corporation.getSalesMultiplier()*Math.pow(markup,2)*businessFactor*advertisingFactor*this.getSalesMultiplier(),sellAmt;if(product.sllman[city][0]&&Object(_utils_helpers_isString__WEBPACK_IMPORTED_MODULE_27__.isString)(product.sllman[city][1])){var tmp=product.sllman[city][1].replace(/MAX/g,maxSell);tmp=tmp.replace(/PROD/g,product.data[city][1]);try{tmp=eval(tmp)}catch(e){Object(_utils_DialogBox__WEBPACK_IMPORTED_MODULE_19__.dialogBoxCreate)("Error evaluating your sell price expression for "+product.name+" in "+this.name+"'s "+city+" office. Sell price is being set to MAX"),tmp=maxSell}sellAmt=Math.min(maxSell,tmp)}else sellAmt=product.sllman[city][0]&&product.sllman[city][1]>0?Math.min(maxSell,product.sllman[city][1]):!1===product.sllman[city][0]?0:maxSell;sellAmt<0&&(sellAmt=0),sellAmt=sellAmt*SecsPerMarketCycle*marketCycles,sellAmt=Math.min(product.data[city][0],sellAmt),sellAmt&&sCost?(product.data[city][0]-=sellAmt,totalProfit+=sellAmt*sCost,product.data[city][2]=sellAmt/(SecsPerMarketCycle*marketCycles)):product.data[city][2]=0;break}case"START":case"PURCHASE":case"EXPORT":break;default:console.error(`Invalid State: ${this.state}`)}}return totalProfit},Industry.prototype.discontinueProduct=function(e){for(var t in this.products)this.products.hasOwnProperty(t)&&e===this.products[t]&&delete this.products[t]},Industry.prototype.upgrade=function(e,t){for(var n=t.corporation,r=t.office,a=e[0];this.upgrades.length<=a;)this.upgrades.push(0);switch(++this.upgrades[a],a){case 0:for(let e=0;e{if(this.sciResearch.qty>=n.cost)return this.sciResearch.qty-=n.cost,t.research(r[e]),this.researched[r[e]]=!0,Object(_utils_DialogBox__WEBPACK_IMPORTED_MODULE_19__.dialogBoxCreate)(`Researched ${r[e]}. It may take a market cycle `+`(~${SecsPerMarketCycle} seconds) before the effects of `+"the Research apply."),this.createResearchBox();Object(_utils_DialogBox__WEBPACK_IMPORTED_MODULE_19__.dialogBoxCreate)(`You do not have enough Scientific Research for ${n.name}`)}):console.warn(`Could not find Research Tree div for ${a}`)}const a=document.getElementById(`${e}-content`);null!=a&&(Object(_utils_uiHelpers_appendLineBreaks__WEBPACK_IMPORTED_MODULE_21__.appendLineBreaks)(a,2),a.appendChild(Object(_utils_uiHelpers_createElement__WEBPACK_IMPORTED_MODULE_22__.createElement)("pre",{display:"block",innerText:"Multipliers from research:\n"+` * Advertising Multiplier: x${t.getAdvertisingMultiplier()}\n`+` * Employee Charisma Multiplier: x${t.getEmployeeChaMultiplier()}\n`+` * Employee Creativity Multiplier: x${t.getEmployeeCreMultiplier()}\n`+` * Employee Efficiency Multiplier: x${t.getEmployeeEffMultiplier()}\n`+` * Employee Intelligence Multiplier: x${t.getEmployeeIntMultiplier()}\n`+` * Production Multiplier: x${t.getProductionMultiplier()}\n`+` * Sales Multiplier: x${t.getSalesMultiplier()}\n`+` * Scientific Research Multiplier: x${t.getScientificResearchMultiplier()}\n`+` * Storage Multiplier: x${t.getStorageMultiplier()}`})),a.appendChild(Object(_utils_uiHelpers_createPopupCloseButton__WEBPACK_IMPORTED_MODULE_24__.createPopupCloseButton)(researchTreeBox,{class:"std-button",display:"block",innerText:"Close"}))),researchTreeBoxOpened=!0},Industry.prototype.toJSON=function(){return Object(_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_20__.Generic_toJSON)("Industry",this)},Industry.fromJSON=function(e){return Object(_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_20__.Generic_fromJSON)(Industry,e.data)},_utils_JSONReviver__WEBPACK_IMPORTED_MODULE_20__.Reviver.constructors.Industry=Industry,Employee.prototype.process=function(e=1,t){var n=.003*e,r=n*Math.random();this.exp+=n,this.cyclesUntilRaise-=e,this.cyclesUntilRaise<=0&&(this.salary+=EmployeeRaiseAmount,this.cyclesUntilRaise+=CyclesPerEmployeeRaise);var a=n*Math.random();return this.pos===_EmployeePositions__WEBPACK_IMPORTED_MODULE_3__.EmployeePositions.Training&&(this.cha+=a,this.exp+=a,this.eff+=a),this.ene-=r,this.hap-=r,this.eneHappiness: "+Object(_utils_StringHelperFunctions__WEBPACK_IMPORTED_MODULE_25__.formatNumber)(this.hap,3)+"
Energy: "+Object(_utils_StringHelperFunctions__WEBPACK_IMPORTED_MODULE_25__.formatNumber)(this.ene,3)+"
Intelligence: "+Object(_utils_StringHelperFunctions__WEBPACK_IMPORTED_MODULE_25__.formatNumber)(i,3)+"
Charisma: "+Object(_utils_StringHelperFunctions__WEBPACK_IMPORTED_MODULE_25__.formatNumber)(a,3)+"
Experience: "+Object(_utils_StringHelperFunctions__WEBPACK_IMPORTED_MODULE_25__.formatNumber)(this.exp,3)+"
Creativity: "+Object(_utils_StringHelperFunctions__WEBPACK_IMPORTED_MODULE_25__.formatNumber)(r,3)+"
Efficiency: "+Object(_utils_StringHelperFunctions__WEBPACK_IMPORTED_MODULE_25__.formatNumber)(o,3)+"
Salary: "+_ui_numeralFormat__WEBPACK_IMPORTED_MODULE_16__.numeralWrapper.format(this.sal,"$0.000a")+"/ s
"}));var s=Object(_utils_uiHelpers_createElement__WEBPACK_IMPORTED_MODULE_22__.createElement)("select",{});for(var l in _EmployeePositions__WEBPACK_IMPORTED_MODULE_3__.EmployeePositions)_EmployeePositions__WEBPACK_IMPORTED_MODULE_3__.EmployeePositions.hasOwnProperty(l)&&s.add(Object(_utils_uiHelpers_createElement__WEBPACK_IMPORTED_MODULE_22__.createElement)("option",{text:_EmployeePositions__WEBPACK_IMPORTED_MODULE_3__.EmployeePositions[l],value:_EmployeePositions__WEBPACK_IMPORTED_MODULE_3__.EmployeePositions[l]}));s.addEventListener("change",()=>{this.pos=s.options[s.selectedIndex].value});for(var c=0;c=this.size},OfficeSpace.prototype.process=function(e=1,t){var n=t.industry;if(n.hasResearch("HRBuddy-Recruitment")&&!this.atCapacity()){const e=this.hireRandomEmployee();n.hasResearch("HRBuddy-Training")&&(e.pos=_EmployeePositions__WEBPACK_IMPORTED_MODULE_3__.EmployeePositions.Training)}this.maxEne=100,this.maxHap=100,this.maxMor=100,n.hasResearch("Go-Juice")&&(this.maxEne+=10),n.hasResearch("JoyWire")&&(this.maxHap+=10),n.hasResearch("Sti.mu")&&(this.maxMor+=10);var r=1;n.funds<0&&n.lastCycleRevenue<0?r=Math.pow(.99,e):n.funds>0&&n.lastCycleRevenue>0&&(r=Math.pow(1.01,e));const a=n.hasResearch("AutoBrew"),i=n.hasResearch("AutoPartyManager");var o=0;for(let t=0;tCharisma: "+Object(_utils_StringHelperFunctions__WEBPACK_IMPORTED_MODULE_25__.formatNumber)(t.cha,1)+"
Experience: "+Object(_utils_StringHelperFunctions__WEBPACK_IMPORTED_MODULE_25__.formatNumber)(t.exp,1)+"
Creativity: "+Object(_utils_StringHelperFunctions__WEBPACK_IMPORTED_MODULE_25__.formatNumber)(t.cre,1)+"
Efficiency: "+Object(_utils_StringHelperFunctions__WEBPACK_IMPORTED_MODULE_25__.formatNumber)(t.eff,1)+"
Salary: "+_ui_numeralFormat__WEBPACK_IMPORTED_MODULE_16__.numeralWrapper.format(t.sal,"$0.000a")+" s
",clickListener:()=>(n.hireEmployee(t,e),Object(_utils_uiHelpers_removeElementById__WEBPACK_IMPORTED_MODULE_30__.removeElementById)("cmpy-mgmt-hire-employee-popup"),!1)})},_=Object(_utils_uiHelpers_createElement__WEBPACK_IMPORTED_MODULE_22__.createElement)("a",{class:"a-link-button",innerText:"Cancel",float:"right",clickListener:()=>(Object(_utils_uiHelpers_removeElementById__WEBPACK_IMPORTED_MODULE_30__.removeElementById)("cmpy-mgmt-hire-employee-popup"),!1)}),g=[h,d(u,this),d(m,this),d(p,this),_];Object(_utils_uiHelpers_createPopup__WEBPACK_IMPORTED_MODULE_23__.createPopup)("cmpy-mgmt-hire-employee-popup",g)}},OfficeSpace.prototype.hireEmployee=function(e,t){var n=t.corporation,r=Object(_utils_YesNoBox__WEBPACK_IMPORTED_MODULE_31__.yesNoTxtInpBoxGetYesButton)(),a=Object(_utils_YesNoBox__WEBPACK_IMPORTED_MODULE_31__.yesNoTxtInpBoxGetNoButton)();r.innerHTML="Hire",a.innerHTML="Cancel",r.addEventListener("click",()=>{for(var t=Object(_utils_YesNoBox__WEBPACK_IMPORTED_MODULE_31__.yesNoTxtInpBoxGetInput)(),r=0;rObject(_utils_YesNoBox__WEBPACK_IMPORTED_MODULE_31__.yesNoTxtInpBoxClose)()),Object(_utils_YesNoBox__WEBPACK_IMPORTED_MODULE_31__.yesNoTxtInpBoxCreate)("Give your employee a nickname!")},OfficeSpace.prototype.hireRandomEmployee=function(){if(!this.atCapacity()&&null==document.getElementById("cmpy-mgmt-hire-employee-popup")){var e=Object(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_26__.getRandomInt)(76,100)/100,t=Object(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_26__.getRandomInt)(50,100),n=Object(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_26__.getRandomInt)(50,100),r=Object(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_26__.getRandomInt)(50,100),a=Object(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_26__.getRandomInt)(50,100),i=Object(_utils_helpers_getRandomInt__WEBPACK_IMPORTED_MODULE_26__.getRandomInt)(50,100),o=new Employee({intelligence:t*e,charisma:n*e,experience:r*e,creativity:a*e,efficiency:i*e,salary:EmployeeSalaryMultiplier*(t+n+r+a+i)*e}),s=Object(_utils_StringHelperFunctions__WEBPACK_IMPORTED_MODULE_25__.generateRandomString)(7);for(let e=0;e=CyclesPerIndustryStateCycle){const e=this.getState(),t=1,n=t*CyclesPerIndustryStateCycle;if(this.storedCycles-=n,this.divisions.forEach(n=>{n.process(t,e,this)}),this.shareSaleCooldown>0&&(this.shareSaleCooldown-=n),this.issueNewSharesCooldown>0&&(this.issueNewSharesCooldown-=n),"START"===e){this.revenue=new decimal_js__WEBPACK_IMPORTED_MODULE_37__.a(0),this.expenses=new decimal_js__WEBPACK_IMPORTED_MODULE_37__.a(0),this.divisions.forEach(e=>{e.lastCycleRevenue!==-1/0&&e.lastCycleRevenue!==1/0&&e.lastCycleExpenses!==-1/0&&e.lastCycleExpenses!==1/0&&(this.revenue=this.revenue.plus(e.lastCycleRevenue),this.expenses=this.expenses.plus(e.lastCycleExpenses))});const e=this.revenue.minus(this.expenses).times(t*SecsPerMarketCycle);if(isNaN(this.funds)&&(Object(_utils_DialogBox__WEBPACK_IMPORTED_MODULE_19__.dialogBoxCreate)("There was an error calculating your Corporations funds and they got reset to 0. This is a bug. Please report to game developer.

(Your funds have been set to $150b for the inconvenience)"),this.funds=new decimal_js__WEBPACK_IMPORTED_MODULE_37__.a(15e10)),this.dividendPercentage>0&&e>0)if(isNaN(this.dividendPercentage)||this.dividendPercentage<0||this.dividendPercentage>DividendMaxPercentage)console.error(`Invalid Corporation dividend percentage: ${this.dividendPercentage}`);else{const t=this.dividendPercentage/100*e,n=e-t,r=t/this.totalShares,a=this.numShares*r*(1-this.dividendTaxPercentage/100);_Player__WEBPACK_IMPORTED_MODULE_15__.Player.gainMoney(a),_Player__WEBPACK_IMPORTED_MODULE_15__.Player.recordMoneySource(a,"corporation"),this.funds=this.funds.plus(n)}else this.funds=this.funds.plus(e);this.updateSharePrice()}this.state.nextState(),_ui_navigationTracking__WEBPACK_IMPORTED_MODULE_17__.routing.isOn(_ui_navigationTracking__WEBPACK_IMPORTED_MODULE_17__.Page.Corporation)&&this.rerender()}},Corporation.prototype.determineValuation=function(){var e,t=this.revenue.minus(this.expenses).toNumber();return this.public?(this.dividendPercentage>0&&(t*=(100-this.dividendPercentage)/100),e=this.funds.toNumber()+85e3*t,e*=Math.pow(1.1,this.divisions.length),e=Math.max(e,0)):(e=1e10+Math.max(this.funds.toNumber(),0)/3,t>0?(e+=315e3*t,e*=Math.pow(1.1,this.divisions.length)):e=1e10*Math.pow(1.1,this.divisions.length),e-=e%1e6),e*_BitNode_BitNodeMultipliers__WEBPACK_IMPORTED_MODULE_11__.BitNodeMultipliers.CorporationValuation},Corporation.prototype.getInvestment=function(){var e,t=this.determineValuation();let n=4;switch(this.fundingRound){case 0:e=.1,n=4;break;case 1:e=.35,n=3;break;case 2:e=.25,n=3;break;case 3:e=.2,n=2.5;break;case 4:return}var r=t*e*n,a=Math.floor(INITIALSHARES*e),i=Object(_utils_YesNoBox__WEBPACK_IMPORTED_MODULE_31__.yesNoBoxGetYesButton)(),o=Object(_utils_YesNoBox__WEBPACK_IMPORTED_MODULE_31__.yesNoBoxGetNoButton)();i.innerHTML="Accept",o.innerHML="Reject",i.addEventListener("click",()=>(++this.fundingRound,this.funds=this.funds.plus(r),this.numShares-=a,this.rerender(),Object(_utils_YesNoBox__WEBPACK_IMPORTED_MODULE_31__.yesNoBoxClose)())),o.addEventListener("click",()=>Object(_utils_YesNoBox__WEBPACK_IMPORTED_MODULE_31__.yesNoBoxClose)()),Object(_utils_YesNoBox__WEBPACK_IMPORTED_MODULE_31__.yesNoBoxCreate)("An investment firm has offered you "+_ui_numeralFormat__WEBPACK_IMPORTED_MODULE_16__.numeralWrapper.format(r,"$0.000a")+" in funding in exchange for a "+_ui_numeralFormat__WEBPACK_IMPORTED_MODULE_16__.numeralWrapper.format(100*e,"0.000a")+"% stake in the company ("+_ui_numeralFormat__WEBPACK_IMPORTED_MODULE_16__.numeralWrapper.format(a,"0.000a")+" shares).

Do you accept or reject this offer?

Hint: Investment firms will offer more money if your corporation is turning a profit")},Corporation.prototype.goPublic=function(){var e,t=this.determineValuation()/this.totalShares,n=Object(_utils_uiHelpers_createElement__WEBPACK_IMPORTED_MODULE_22__.createElement)("p",{innerHTML:"Enter the number of shares you would like to issue for your IPO. These shares will be publicly sold and you will no longer own them. Your Corporation will receive "+_ui_numeralFormat__WEBPACK_IMPORTED_MODULE_16__.numeralWrapper.format(t,"$0.000a")+" per share (the IPO money will be deposited directly into your Corporation's funds).

You have a total of "+_ui_numeralFormat__WEBPACK_IMPORTED_MODULE_16__.numeralWrapper.format(this.numShares,"0.000a")+" of shares that you can issue."}),r=Object(_utils_uiHelpers_createElement__WEBPACK_IMPORTED_MODULE_22__.createElement)("input",{type:"number",placeholder:"Shares to issue",onkeyup:t=>{t.preventDefault(),t.keyCode===_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_28__.KEY.ENTER&&e.click()}}),a=Object(_utils_uiHelpers_createElement__WEBPACK_IMPORTED_MODULE_22__.createElement)("br",{});e=Object(_utils_uiHelpers_createElement__WEBPACK_IMPORTED_MODULE_22__.createElement)("a",{class:"a-link-button",innerText:"Go Public",clickListener:()=>{var e=Math.round(r.value),t=this.determineValuation()/this.totalShares;return isNaN(e)?(Object(_utils_DialogBox__WEBPACK_IMPORTED_MODULE_19__.dialogBoxCreate)("Invalid value for number of issued shares"),!1):e>this.numShares?(Object(_utils_DialogBox__WEBPACK_IMPORTED_MODULE_19__.dialogBoxCreate)("Error: You don't have that many shares to issue!"),!1):(this.public=!0,this.sharePrice=t,this.issuedShares=e,this.numShares-=e,this.funds=this.funds.plus(e*t),this.rerender(),Object(_utils_uiHelpers_removeElementById__WEBPACK_IMPORTED_MODULE_30__.removeElementById)("cmpy-mgmt-go-public-popup"),Object(_utils_DialogBox__WEBPACK_IMPORTED_MODULE_19__.dialogBoxCreate)(`You took your ${this.name} public and earned `+`${_ui_numeralFormat__WEBPACK_IMPORTED_MODULE_16__.numeralWrapper.formatMoney(e*t)} in your IPO`),!1)}});var i=Object(_utils_uiHelpers_createElement__WEBPACK_IMPORTED_MODULE_22__.createElement)("a",{class:"a-link-button",innerText:"Cancel",clickListener:()=>(Object(_utils_uiHelpers_removeElementById__WEBPACK_IMPORTED_MODULE_30__.removeElementById)("cmpy-mgmt-go-public-popup"),!1)});Object(_utils_uiHelpers_createPopup__WEBPACK_IMPORTED_MODULE_23__.createPopup)("cmpy-mgmt-go-public-popup",[n,a,r,e,i])},Corporation.prototype.getTargetSharePrice=function(){return this.determineValuation()/(2*(this.totalShares-this.numShares)+1)},Corporation.prototype.updateSharePrice=function(){const e=this.getTargetSharePrice();this.sharePrice<=e?this.sharePrice*=1+.01*Math.random():this.sharePrice*=1-.01*Math.random(),this.sharePrice<=.01&&(this.sharePrice=.01)},Corporation.prototype.immediatelyUpdateSharePrice=function(){this.sharePrice=this.getTargetSharePrice()},Corporation.prototype.calculateShareSale=function(e){let t=e,n=this.shareSalesUntilPriceUpdate,r=this.sharePrice,a=0,i=0;const o=Math.ceil(e/SHARESPERPRICEUPDATE);if(!(isNaN(o)||o>1e7)){for(let e=0;e3600?`${Math.floor(t/3600)} hour(s)`:t>60?`${Math.floor(t/60)} minute(s)`:`${Math.floor(t)} second(s)`},Corporation.prototype.unlock=function(e){const t=e[0],n=e[1];for(;this.unlockUpgrades.length<=t;)this.unlockUpgrades.push(0);this.funds.lt(n)?Object(_utils_DialogBox__WEBPACK_IMPORTED_MODULE_19__.dialogBoxCreate)("You don't have enough funds to unlock this!"):(this.unlockUpgrades[t]=1,this.funds=this.funds.minus(n),5===t?this.dividendTaxPercentage-=5:6===t&&(this.dividendTaxPercentage-=10))},Corporation.prototype.upgrade=function(e){for(var t=e[0],n=e[1],r=e[2],a=e[3];this.upgrades.length<=t;)this.upgrades.push(0);for(;this.upgradeMultipliers.length<=t;)this.upgradeMultipliers.push(1);var i=n*Math.pow(r,this.upgrades[t]);if(this.funds.lt(i))Object(_utils_DialogBox__WEBPACK_IMPORTED_MODULE_19__.dialogBoxCreate)("You don't have enough funds to purchase this!");else if(++this.upgrades[t],this.funds=this.funds.minus(i),this.upgradeMultipliers[t]=1+this.upgrades[t]*a,1===t)for(var o=0;od.Start&&(_.currStep-=1);y()}(),!1}),Object(c.clearEventListeners)("interactive-tutorial-next").addEventListener("click",function(){return f(),!1}),y()}function y(){if(_.isRunning){var e=Object(c.clearEventListeners)("terminal-menu-link"),t=Object(c.clearEventListeners)("stats-menu-link"),n=Object(c.clearEventListeners)("active-scripts-menu-link"),a=Object(c.clearEventListeners)("hacknet-nodes-menu-link"),i=Object(c.clearEventListeners)("city-menu-link"),o=Object(c.clearEventListeners)("tutorial-menu-link");e.removeAttribute("class"),t.removeAttribute("class"),n.removeAttribute("class"),a.removeAttribute("class"),i.removeAttribute("class"),o.removeAttribute("class");var s=document.getElementById("interactive-tutorial-next");switch(_.currStep){case d.Start:r.Engine.loadTerminalContent(),E("Welcome to Bitburner, a cyberpunk-themed incremental RPG! The game takes place in a dark, dystopian future...The year is 2077...

This tutorial will show you the basics of the game. You may skip the tutorial at any time."),s.style.display="inline-block";break;case d.GoToCharacterPage:r.Engine.loadTerminalContent(),E("Let's start by heading to the Stats page. Click the 'Stats' tab on the main navigation menu (left-hand side of the screen)"),s.style.display="none",t.setAttribute("class","flashing-button"),t.addEventListener("click",function(){return r.Engine.loadCharacterContent(),f(),!1});break;case d.CharacterPage:r.Engine.loadCharacterContent(),E("The Stats page shows a lot of important information about your progress, such as your skills, money, and bonuses/multipliers. "),s.style.display="inline-block";break;case d.CharacterGoToTerminalPage:r.Engine.loadCharacterContent(),E("Let's head to your computer's terminal by clicking the 'Terminal' tab on the main navigation menu."),s.style.display="none",e.setAttribute("class","flashing-button"),e.addEventListener("click",function(){return r.Engine.loadTerminalContent(),f(),!1});break;case d.TerminalIntro:r.Engine.loadTerminalContent(),E("The Terminal is used to interface with your home computer as well as all of the other machines around the world."),s.style.display="inline-block";break;case d.TerminalHelp:r.Engine.loadTerminalContent(),E("Let's try it out. Start by entering the 'help' command into the Terminal (Don't forget to press Enter after typing the command)"),s.style.display="none";break;case d.TerminalLs:r.Engine.loadTerminalContent(),E("The 'help' command displays a list of all available Terminal commands, how to use them, and a description of what they do.

Let's try another command. Enter the 'ls' command"),s.style.display="none";break;case d.TerminalScan:r.Engine.loadTerminalContent(),E("'ls' is a basic command that shows all of the contents (programs/scripts) on the computer. Right now, it shows that you have a program called 'NUKE.exe' on your computer. We'll get to what this does later.

Using your home computer's terminal, you can connect to other machines throughout the world. Let's do that now by first entering the 'scan' command."),s.style.display="none";break;case d.TerminalScanAnalyze1:r.Engine.loadTerminalContent(),E("The 'scan' command shows all available network connections. In other words, it displays a list of all servers that can be connected to from your current machine. A server is identified by either its IP or its hostname.

That's great and all, but there's so many servers. Which one should you go to? The 'scan-analyze' command gives some more detailed information about servers on the network. Try it now"),s.style.display="none";break;case d.TerminalScanAnalyze2:r.Engine.loadTerminalContent(),E("You just ran 'scan-analyze' with a depth of one. This command shows more detailed information about each server that you can connect to (servers that are a distance of one node away).

It is also possible to run 'scan-analyze' with a higher depth. Let's try a depth of two with the following command: 'scan-analyze 2'."),s.style.display="none";break;case d.TerminalConnect:r.Engine.loadTerminalContent(),E("Now you can see information about all servers that are up to two nodes away, as well as figure out how to navigate to those servers through the network. You can only connect to a server that is one node away. To connect to a machine, use the 'connect [ip/hostname]' command. You can type in the ip or the hostname, but dont use both.

From the results of the 'scan-analyze' command, we can see that the 'foodnstuff' server is only one node away. Let's connect so it now using: 'connect foodnstuff'"),s.style.display="none";break;case d.TerminalAnalyze:r.Engine.loadTerminalContent(),E("You are now connected to another machine! What can you do now? You can hack it!

In the year 2077, currency has become digital and decentralized. People and corporations store their money on servers and computers. Using your hacking abilities, you can hack servers to steal money and gain experience.

Before you try to hack a server, you should run diagnostics using the 'analyze' command"),s.style.display="none";break;case d.TerminalNuke:r.Engine.loadTerminalContent(),E("When the 'analyze' command finishes running it will show useful information about hacking the server.

For this server, the required hacking skill is only 1, which means you can hack it right now. However, in order to hack a server you must first gain root access. The 'NUKE.exe' program that we saw earlier on your home computer is a virus that will grant you root access to a machine if there are enough open ports.

The 'analyze' results shows that there do not need to be any open ports on this machine for the NUKE virus to work, so go ahead and run the virus using the 'run NUKE.exe' command."),s.style.display="none";break;case d.TerminalManualHack:r.Engine.loadTerminalContent(),E("You now have root access! You can hack the server using the 'hack' command. Try doing that now."),s.style.display="none";break;case d.TerminalHackingMechanics:r.Engine.loadTerminalContent(),E("You are now attempting to hack the server. Note that performing a hack takes time and only has a certain percentage chance of success. This time and success chance is determined by a variety of factors, including your hacking skill and the server's security level.

If your attempt to hack the server is successful, you will steal a certain percentage of the server's total money. This percentage is affected by your hacking skill and the server's security level.

The amount of money on a server is not limitless. So, if you constantly hack a server and deplete its money, then you will encounter diminishing returns in your hacking."),s.style.display="inline-block";break;case d.TerminalCreateScript:r.Engine.loadTerminalContent(),E("Hacking is the core mechanic of the game and is necessary for progressing. However, you don't want to be hacking manually the entire time. You can automate your hacking by writing scripts!

To create a new script or edit an existing one, you can use the 'nano' command. Scripts must end with the '.script' extension. Let's make a script now by entering 'nano foodnstuff.script' after the hack command finishes running (Sidenote: Pressing ctrl + c will end a command like hack early)"),s.style.display="none";break;case d.TerminalTypeScript:r.Engine.loadScriptEditorContent("foodnstuff.script",""),E("This is the script editor. You can use it to program your scripts. Scripts are written in the Netscript language, a programming language created for this game. There are details about the Netscript language in the documentation, which can be accessed in the 'Tutorial' tab on the main navigation menu. I highly suggest you check it out after this tutorial. For now, just copy and paste the following code into the script editor:

while(true) {
  hack('foodnstuff');
}

For anyone with basic programming experience, this code should be straightforward. This script will continuously hack the 'foodnstuff' server.

To save and close the script editor, press the button in the bottom left, or press ctrl + b."),s.style.display="none";break;case d.TerminalFree:r.Engine.loadTerminalContent(),E("Now we'll run the script. Scripts require a certain amount of RAM to run, and can be run on any machine which you have root access to. Different servers have different amounts of RAM. You can also purchase more RAM for your home server.

To check how much RAM is available on this machine, enter the 'free' command."),s.style.display="none";break;case d.TerminalRunScript:r.Engine.loadTerminalContent(),E("We have 16GB of free RAM on this machine, which is enough to run our script. Let's run our script using 'run foodnstuff.script'."),s.style.display="none";break;case d.TerminalGoToActiveScriptsPage:r.Engine.loadTerminalContent(),E("Your script is now running! The script might take a few seconds to 'fully start up'. Your scripts will continuously run in the background and will automatically stop if the code ever completes (the 'foodnstuff.script' will never complete because it runs an infinite loop).

These scripts can passively earn you income and hacking experience. Your scripts will also earn money and experience while you are offline, although at a much slower rate.

Let's check out some statistics for our running scripts by clicking the 'Active Scripts' link in the main navigation menu."),s.style.display="none",n.setAttribute("class","flashing-button"),n.addEventListener("click",function(){return r.Engine.loadActiveScriptsContent(),f(),!1});break;case d.ActiveScriptsPage:r.Engine.loadActiveScriptsContent(),E("This page displays stats/information about all of your scripts that are running across every existing server. You can use this to gauge how well your scripts are doing. Let's go back to the Terminal now using the 'Terminal' link."),s.style.display="none",e.setAttribute("class","flashing-button"),e.addEventListener("click",function(){return r.Engine.loadTerminalContent(),f(),!1});break;case d.ActiveScriptsToTerminal:r.Engine.loadTerminalContent(),E("One last thing about scripts, each active script contains logs that detail what it's doing. We can check these logs using the 'tail' command. Do that now for the script we just ran by typing 'tail foodnstuff.script'"),s.style.display="none";break;case d.TerminalTailScript:r.Engine.loadTerminalContent(),E("The log for this script won't show much right now (it might show nothing at all) because it just started running...but check back again in a few minutes!

This pretty much covers the basics of hacking. To learn more about writing scripts using the Netscript language, select the 'Tutorial' link in the main navigation menu to look at the documentation. If you are an experienced JavaScript developer, I would highly suggest you check out the section on NetscriptJS/Netscript 2.0.

For now, let's move on to something else!"),s.style.display="inline-block";break;case d.GoToHacknetNodesPage:r.Engine.loadTerminalContent(),E("Hacking is not the only way to earn money. One other way to passively earn money is by purchasing and upgrading Hacknet Nodes. Let's go to the 'Hacknet Nodes' page through the main navigation menu now."),s.style.display="none",a.setAttribute("class","flashing-button"),a.addEventListener("click",function(){return r.Engine.loadHacknetNodesContent(),f(),!1});break;case d.HacknetNodesIntroduction:r.Engine.loadHacknetNodesContent(),E("From this page you can purchase new Hacknet Nodes and upgrade your existing ones. Let's purchase a new one now."),s.style.display="none";break;case d.HacknetNodesGoToWorldPage:r.Engine.loadHacknetNodesContent(),E("You just purchased a Hacknet Node! This Hacknet Node will passively earn you money over time, both online and offline. When you get enough money, you can upgrade your newly-purchased Hacknet Node below.

Let's go to the 'City' page through the main navigation menu."),s.style.display="none",i.setAttribute("class","flashing-button"),i.addEventListener("click",function(){return r.Engine.loadLocationContent(),f(),!1});break;case d.WorldDescription:r.Engine.loadLocationContent(),E("This page lists all of the different locations you can currently travel to. Each location has something that you can do. There's a lot of content out in the world, make sure you explore and discover!

Lastly, click on the 'Tutorial' link in the main navigation menu."),s.style.display="none",o.setAttribute("class","flashing-button"),o.addEventListener("click",function(){return r.Engine.loadTutorialContent(),f(),!1});break;case d.TutorialPageInfo:r.Engine.loadTutorialContent(),E("This page contains a lot of different documentation about the game's content and mechanics. I know it's a lot, but I highly suggest you read (or at least skim) through this before you start playing. That's the end of the tutorial. Hope you enjoy the game!"),s.style.display="inline-block",s.innerHTML="Finish Tutorial";break;case d.End:b();break;default:throw new Error("Invalid tutorial step")}!0===_.stepIsDone[_.currStep]&&(s.style.display="inline-block")}}function f(){_.currStep===d.GoToCharacterPage&&document.getElementById("stats-menu-link").removeAttribute("class"),_.currStep===d.CharacterGoToTerminalPage&&document.getElementById("terminal-menu-link").removeAttribute("class"),_.currStep===d.TerminalGoToActiveScriptsPage&&document.getElementById("active-scripts-menu-link").removeAttribute("class"),_.currStep===d.ActiveScriptsPage&&document.getElementById("terminal-menu-link").removeAttribute("class"),_.currStep===d.GoToHacknetNodesPage&&document.getElementById("hacknet-nodes-menu-link").removeAttribute("class"),_.currStep===d.HacknetNodesGoToWorldPage&&document.getElementById("city-menu-link").removeAttribute("class"),_.currStep===d.WorldDescription&&document.getElementById("tutorial-menu-link").removeAttribute("class"),_.stepIsDone[_.currStep]=!0,_.currStep
Getting Started GuideDocumentation

The Beginner's Guide to Hacking was added to your home computer! It contains some tips/pointers for starting out with the game. To read it, go to Terminal and enter

cat "+s.LiteratureNames.HackersStartingHandbook}),n=Object(u.createElement)("a",{class:"a-link-button",float:"right",padding:"6px",innerText:"Got it!",clickListener:()=>{Object(p.removeElementById)(e)}});Object(m.createPopup)(e,[t,n]),a.Player.getHomeComputer().messages.push(s.LiteratureNames.HackersStartingHandbook)}function E(e){var t=document.getElementById("interactive-tutorial-text");if(null==t)throw new Error("Could not find text box");t.innerHTML=e,t.parentElement.scrollTop=0}},,,function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),a=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return a(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.displayStockMarketContent=t.processStockPrices=t.stockMarketCycle=t.initSymbolToStockMap=t.initStockMarket=t.deleteStockMarket=t.loadStockMarket=t.cancelOrder=t.placeOrder=t.SymbolToStockMap=t.StockMarket=void 0;const o=n(177),s=n(932),l=n(931),c=n(195),u=n(930),m=n(929),p=n(123),h=n(105),d=n(284),_=n(928),g=n(9),y=n(1),f=n(484),b=n(16),E=n(2),v=n(12),k=n(25),C=i(n(0)),P=i(n(26));function S(e,n,r,a,i,o=null){if(!(e instanceof c.Stock))return o?o.log("placeOrder",`Invalid stock: '${e}'`):v.dialogBoxCreate("ERROR: Invalid stock passed to placeOrder() function"),!1;if("number"!=typeof n||"number"!=typeof r)return o?o.log("placeOrder",`Invalid arguments: shares='${n}' price='${r}'`):v.dialogBoxCreate("ERROR: Invalid numeric value provided for either 'shares' or 'price' argument"),!1;const u=new s.Order(e.symbol,n,r,a,i);if(null==t.StockMarket.Orders){const e={};for(const n in t.StockMarket){const r=t.StockMarket[n];r instanceof c.Stock&&(e[r.symbol]=[])}t.StockMarket.Orders=e}t.StockMarket.Orders[e.symbol].push(u);const m={rerenderFn:D,stockMarket:t.StockMarket,symbolToStockMap:t.SymbolToStockMap};return l.processOrders(e,u.type,u.pos,m),D(),!0}function O(e,n=null){if(null==t.StockMarket.Orders)return!1;if(e.order&&e.order instanceof s.Order){const n=e.order,r=t.StockMarket.Orders[n.stockSymbol];for(let e=0;e=n.cap&&(i=.1,n.b=!1),isNaN(i)&&(i=.5);const o=Math.random(),s={rerenderFn:D,stockMarket:t.StockMarket,symbolToStockMap:t.SymbolToStockMap};o1?1:i<0?0:i},t.calculateHackingExpGain=function(e,t){null==e.baseDifficulty&&(e.baseDifficulty=e.hackDifficulty);let n=3;return(n+=e.baseDifficulty*t.hacking_exp_mult*.3)*r.BitNodeMultipliers.HackExpGain},t.calculatePercentMoneyHacked=function(e,t){const n=(100-e.hackDifficulty)/100*((t.hacking_skill-(e.requiredHackingSkill-1))/t.hacking_skill)*t.hacking_money_mult/240;return n<0?0:n>1?1:n*r.BitNodeMultipliers.ScriptHackMoney},t.calculateHackingTime=i,t.calculateGrowTime=function(e,t){return 3.2*i(e,t)},t.calculateWeakenTime=function(e,t){return 4*i(e,t)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CompanyPositions=void 0;const r=n(1163),a=n(285);t.CompanyPositions={},r.companyPositionMetadata.forEach(e=>{!function(e){null!=t.CompanyPositions[e.name]&&console.warn(`Duplicate Company Position being defined: ${e.name}`),t.CompanyPositions[e.name]=new a.CompanyPosition(e)}(e)})},,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isString=void 0,t.isString=function(e){return"string"==typeof e||e instanceof String}},,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.exceptionAlert=void 0;const r=n(12);t.exceptionAlert=function(e){console.error(e),r.dialogBoxCreate("Caught an exception: "+e+"

Filename: "+(e.fileName||"UNKNOWN FILE NAME")+"

Line Number: "+(e.lineNumber||"UNKNOWN LINE NUMBER")+"

This is a bug, please report to game developer with this message as well as details about how to reproduce the bug.

If you want to be safe, I suggest refreshing the game WITHOUT saving so that your safe doesn't get corrupted",!1)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.OwnedAugmentationsOrderSetting=t.PurchaseAugmentationsOrderSetting=t.EditorSetting=t.CodeMirrorThemeSetting=t.CodeMirrorKeybindingSetting=t.AceKeybindingSetting=void 0,function(e){e.Ace="ace",e.Emacs="emacs",e.Vim="vim"}(t.AceKeybindingSetting||(t.AceKeybindingSetting={})),function(e){e.Default="default",e.Emacs="emacs",e.Sublime="sublime",e.Vim="vim"}(t.CodeMirrorKeybindingSetting||(t.CodeMirrorKeybindingSetting={})),function(e){e.Monokai="monokai",e.Day_3024="3024-day",e.Night_3024="3024-night",e.abcdef="abcdef",e.Ambiance_mobile="ambiance-mobile",e.Ambiance="ambiance",e.Base16_dark="base16-dark",e.Base16_light="base16-light",e.Bespin="bespin",e.Blackboard="blackboard",e.Cobalt="cobalt",e.Colorforth="colorforth",e.Darcula="darcula",e.Dracula="dracula",e.Duotone_dark="duotone-dark",e.Duotone_light="duotone-light",e.Eclipse="eclipse",e.Elegant="elegant",e.Erlang_dark="erlang-dark",e.Gruvbox_dark="gruvbox-dark",e.Hopscotch="hopscotch",e.Icecoder="icecoder",e.Idea="idea",e.Isotope="isotope",e.Lesser_dark="lesser-dark",e.Liquibyte="liquibyte",e.Lucario="lucario",e.Material="material",e.Mbo="mbo",e.Mdn_like="mdn-like",e.Midnight="midnight",e.Neat="neat",e.Neo="neo",e.Night="night",e.Oceanic_next="oceanic-next",e.Panda_syntax="panda-syntax",e.Paraiso_dark="paraiso-dark",e.Paraiso_light="paraiso-light",e.Pastel_on_dark="pastel-on-dark",e.Railscasts="railscasts",e.Rubyblue="rubyblue",e.Seti="seti",e.Shadowfox="shadowfox",e.Solarized="solarized",e.SolarizedDark="solarized dark",e.ssms="ssms",e.The_matrix="the-matrix",e.Tomorrow_night_bright="tomorrow-night-bright",e.Tomorrow_night_eighties="tomorrow-night-eighties",e.Ttcn="ttcn",e.Twilight="twilight",e.Vibrant_ink="vibrant-ink",e.xq_dark="xq-dark",e.xq_light="xq-light",e.Yeti="yeti",e.Zenburn="zenburn"}(t.CodeMirrorThemeSetting||(t.CodeMirrorThemeSetting={})),function(e){e.Ace="Ace",e.CodeMirror="CodeMirror"}(t.EditorSetting||(t.EditorSetting={})),function(e){e[e.Cost=0]="Cost",e[e.Default=1]="Default",e[e.Reputation=2]="Reputation"}(t.PurchaseAugmentationsOrderSetting||(t.PurchaseAugmentationsOrderSetting={})),function(e){e[e.Alphabetically=0]="Alphabetically",e[e.AcquirementTime=1]="AcquirementTime"}(t.OwnedAugmentationsOrderSetting||(t.OwnedAugmentationsOrderSetting={}))},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.PartTimeCompanyPositions=t.BusinessConsultantCompanyPositions=t.SoftwareConsultantCompanyPositions=t.MiscCompanyPositions=t.AgentCompanyPositions=t.SecurityCompanyPositions=t.BusinessCompanyPositions=t.NetworkEngineerCompanyPositions=t.SecurityEngineerCompanyPositions=t.ITCompanyPositions=t.SoftwareCompanyPositions=void 0,t.SoftwareCompanyPositions=["Software Engineering Intern","Junior Software Engineer","Senior Software Engineer","Lead Software Developer","Head of Software","Head of Engineering","Vice President of Technology","Chief Technology Officer"],t.ITCompanyPositions=["IT Intern","IT Analyst","IT Manager","Systems Administrator"],t.SecurityEngineerCompanyPositions=["Security Engineer"],t.NetworkEngineerCompanyPositions=["Network Engineer","Network Administrator"],t.BusinessCompanyPositions=["Business Intern","Business Analyst","Business Manager","Operations Manager","Chief Financial Officer","Chief Executive Officer"],t.SecurityCompanyPositions=["Police Officer","Police Chief","Security Guard","Security Officer","Security Supervisor","Head of Security"],t.AgentCompanyPositions=["Field Agent","Secret Agent","Special Operative"],t.MiscCompanyPositions=["Waiter","Employee"],t.SoftwareConsultantCompanyPositions=["Software Consultant","Senior Software Consultant"],t.BusinessConsultantCompanyPositions=["Business Consultant","Senior Business Consultant"],t.PartTimeCompanyPositions=["Part-time Waiter","Part-time Employee"]},function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),a=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return a(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.Reputation=void 0;const o=i(n(0)),s=n(2);t.Reputation=function(e){return o.createElement("span",{className:"reputation samefont"},"number"==typeof e?s.numeralWrapper.formatReputation(e):e)}},function(e,t,n){"use strict";n.r(t),n.d(t,"inviteToFaction",function(){return O}),n.d(t,"joinFaction",function(){return T}),n.d(t,"startHackingMission",function(){return M}),n.d(t,"displayFactionContent",function(){return x}),n.d(t,"purchaseAugmentationBoxCreate",function(){return w}),n.d(t,"hasAugmentationPrereqs",function(){return A}),n.d(t,"purchaseAugmentation",function(){return R}),n.d(t,"getNextNeurofluxLevel",function(){return N}),n.d(t,"processPassiveFactionRepGain",function(){return D});var r=n(0),a=n.n(r),i=n(26),o=n.n(i),s=n(762),l=n(15),c=n(97),u=n(198),m=n(4),p=n(23),h=n(9),d=n(17),_=n(114),g=n(19),y=n(93),f=n(1),b=n(18),E=n(120),v=n(16),k=n(12),C=n(761),P=n(31),S=n(58);function O(e){b.Settings.SuppressFactionInvites?(e.alreadyInvited=!0,f.Player.factionInvitations.push(e.name),v.routing.isOn(v.Page.Factions)&&d.Engine.loadFactionsContent()):Object(C.a)(e)}function T(e){e.isMember=!0,f.Player.factions.push(e.name);const t=e.getInfo();for(const e in t.enemies){const n=t.enemies[e];g.Factions[n]instanceof _.Faction&&(g.Factions[n].isBanned=!0)}for(var n=0;n0)for(let n=0;n{if(e instanceof Element)a.removeElement(e);else try{const t=document.getElementById(e);t instanceof Element&&a.removeElement(t)}catch(e){console.error(`createPopupCloseButton() threw: ${e}`)}return document.removeEventListener("keydown",i),!1}),document.addEventListener("keydown",i),n}},,function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),a=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.prototype.hasOwnProperty.call(e,n)&&r(t,e,n);return a(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.StdButton=void 0;const o=i(n(0));t.StdButton=function(e){const t=null!=e.tooltip&&""!==e.tooltip;let n,r=e.disabled?"std-button-disabled":"std-button";if(t&&(r+=" tooltip"),"string"==typeof e.addClasses&&(r+=` ${e.addClasses}`),t)if("string"==typeof e.tooltip){const t={__html:e.tooltip};n=o.createElement("span",{className:"tooltiptext",dangerouslySetInnerHTML:t})}else n=o.createElement("span",{className:"tooltiptext"},e.tooltip);return o.createElement("button",{className:r,id:e.id,onClick:e.onClick,style:e.style},e.text,t&&n)}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isScriptFilename=void 0,t.isScriptFilename=function(e){return e.endsWith(".js")||e.endsWith(".script")||e.endsWith(".ns")}},function(e,t,n){"use strict";n.d(t,"a",function(){return i});var r=n(0);const a=n.n(r).a.Component;class i extends a{corp(){return this.props.corp}eventHandler(){return this.props.eventHandler}routing(){return this.props.routing}}},,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.createOptionElement=void 0;const r=n(5);t.createOptionElement=function(e,t=""){let n=t;return""===n&&(n=e),r.createElement("option",{text:e,value:n})}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.substituteAliases=t.removeAlias=t.parseAliasDeclaration=t.printAliases=t.loadGlobalAliases=t.loadAliases=t.GlobalAliases=t.Aliases=void 0;const r=n(8);function a(e){return t.Aliases.hasOwnProperty(e)?t.Aliases[e]:null}function i(e){return t.GlobalAliases.hasOwnProperty(e)?t.GlobalAliases[e]:null}t.Aliases={},t.GlobalAliases={},t.loadAliases=function(e){t.Aliases=""===e?{}:JSON.parse(e)},t.loadGlobalAliases=function(e){t.GlobalAliases=""===e?{}:JSON.parse(e)},t.printAliases=function(){for(const e in t.Aliases)t.Aliases.hasOwnProperty(e)&&r.post("alias "+e+"="+t.Aliases[e]);for(const e in t.GlobalAliases)t.GlobalAliases.hasOwnProperty(e)&&r.post("global alias "+e+"="+t.GlobalAliases[e])},t.parseAliasDeclaration=function(e,n=!1){const r=e.match(/^([_|\w|!|%|,|@]+)="(.+)"$/);return null!=r&&3==r.length&&(n?function(e,n){e in t.Aliases&&delete t.Aliases[e],t.GlobalAliases[e]=n.trim()}(r[1],r[2]):function(e,n){e in t.GlobalAliases&&delete t.GlobalAliases[e],t.Aliases[e]=n.trim()}(r[1],r[2]),!0)},t.removeAlias=function(e){return t.Aliases.hasOwnProperty(e)?(delete t.Aliases[e],!0):!!t.GlobalAliases.hasOwnProperty(e)&&(delete t.GlobalAliases[e],!0)},t.substituteAliases=function(e){var t,n;const r=e.split(" ");if(r.length>0){if("unalias"===r[0]||"alias"===r[0])return r.join(" ");let e=!0,o=0;for(;e&&o<10;){o++,e=!1;const s=null===(t=a(r[0]))||void 0===t?void 0:t.split(" ");null!=s&&(e=!0,r.splice(0,1,...s));for(let t=0;t{t.delay=null,n()},e),t.delayResolve=n})}function s(e,t,n=null){var r="";null!=n&&(r=" (Line "+function(e,t){var n=t.scriptRef.codeCode();try{return((n=n.substring(0,e.start)).match(/\n/g)||[]).length+1}catch(e){return-1}}(n,e)+")");const a=i.AllServers[e.serverIp];if(null==a)throw new Error(`WorkerScript constructed with invalid server ip: ${this.serverIp}`);return"|"+a.hostname+"|"+e.name+"|"+t+r}function l(e,t,n){const r=e.scriptRef.threads;if(!n)return isNaN(r)||r<1?1:r;const a=0|n;if(isNaN(n)||a<1)throw s(e,`Invalid thread count passed to ${t}: ${n}. Threads must be a positive number.`);if(n>r)throw s(e,`Too many threads requested by ${t}. Requested: ${n}. Has: ${r}.`);return a}function c(e){if(!Object(a.isString)(e))return!1;return 4==e.split("|").length}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.setTimeoutRef=void 0,t.setTimeoutRef=window.setTimeout.bind(window)},,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.killWorkerScript=void 0;const r=n(250),a=n(125),i=n(157),o=n(199),s=n(27),l=n(409),c=n(292);function u(e,t=!0){const n=a.workerScripts.get(e);return n instanceof r.WorkerScript&&(m(n,t),!0)}function m(e,t=!0){e.env.stopFlag=!0,function(e){e instanceof r.WorkerScript&&e.delay&&(clearTimeout(e.delay),e.delayResolve&&e.delayResolve())}(e),function(e,t=!0){if(!(e instanceof r.WorkerScript))return console.error("Invalid argument passed into removeWorkerScript():"),void console.error(e);{const n=e.serverIp,r=e.name,o=s.AllServers[n];if(null==o)return void console.error(`Could not find server on which this script is running: ${n}`);o.ramUsed=c.roundToTwo(o.ramUsed-e.ramUsage),o.ramUsed<0&&(console.warn(`Server (${o.hostname}) RAM usage went negative (if it's due to floating pt imprecision, it's okay): ${o.ramUsed}`),o.ramUsed=0);for(let t=0;t{let e=x();return null!=e&&e.beautifyScript(),!1}});T=Object(S.createElement)("p",{display:"inline-block",margin:"10px",id:"script-editor-status-text"});const n=Object(S.createElement)("label",{for:"script-editor-ram-check",margin:"4px",marginTop:"8px",innerText:"Dynamic RAM Usage Checker",color:"white",tooltip:"Enable/Disable the dynamic RAM Usage display. You may want to disable it for very long scripts because there may be performance issues"});(O=Object(S.createElement)("input",{type:"checkbox",name:"script-editor-ram-check",id:"script-editor-ram-check",margin:"4px",marginTop:"8px"})).checked=!0;const r=Object(S.createElement)("a",{class:"std-button",display:"inline-block",href:"https://bitburner.readthedocs.io/en/latest/index.html",innerText:"Netscript Documentation",target:"_blank"}),a=Object(S.createElement)("button",{class:"std-button",display:"inline-block",innerText:"Save & Close (Ctrl/Cmd + b)",clickListener:()=>(A(),!1)});e.appendChild(t),e.appendChild(a),e.appendChild(T),e.appendChild(O),e.appendChild(n),e.appendChild(r);const i={saveAndCloseFn:A,quitFn:l.Engine.loadTerminalContent};p.a.init(i),h.a.init(i);const o=document.getElementById("script-editor-option-editor");if(null==o)return console.error("Could not find DOM Element for editor selector (id=script-editor-option-editor)"),!1;for(let e=0;e{const e=o.value;switch(e){case f.EditorSetting.Ace:{const e=h.a.getCode(),t=h.a.getFilename();p.a.create(),h.a.setInvisible(),p.a.openScript(t,e);break}case f.EditorSetting.CodeMirror:{const e=p.a.getCode(),t=p.a.getFilename();h.a.create(),p.a.setInvisible(),h.a.openScript(t,e);break}default:return void console.error(`Unrecognized Editor Setting: ${e}`)}y.Settings.Editor=e}),o.onchange()}function x(){switch(y.Settings.Editor){case f.EditorSetting.Ace:return p.a;case f.EditorSetting.CodeMirror:return h.a;default:throw new Error(`Invalid Editor Setting: ${y.Settings.Editor}`)}}async function w(){var e=document.getElementById("script-editor-filename").value;if(null==O||!O.checked||!Object(o.isScriptFilename)(e))return void(T.innerText="N/A");let t;try{t=x().getCode()}catch(e){return void(T.innerText="RAM: ERROR")}var n=t.repeat(1),r=await Object(i.calculateRamUsage)(n,m.Player.getCurrentServer().scripts);if(r>0)T.innerText="RAM: "+k.numeralWrapper.formatRAM(r);else switch(r){case a.RamCalculationErrorCode.ImportError:T.innerText="RAM: Import Error";break;case a.RamCalculationErrorCode.URLImportError:T.innerText="RAM: HTTP Import Error";break;case a.RamCalculationErrorCode.SyntaxError:default:T.innerText="RAM: Syntax Error"}}function A(){var e=document.getElementById("script-editor-filename").value;let t,n;try{t=x().getCode(),n=x().getCursor(),d.CursorPositions.saveCursor(e,n)}catch(e){return void Object(C.dialogBoxCreate)("Something went wrong when trying to save (getCurrentEditor().getCode() or getCurrentEditor().getCursor()). Please report to game developer with details")}if(u.a.isRunning&&u.a.currStep===u.d.TerminalTypeScript){if("foodnstuff.script"!==e)return void Object(C.dialogBoxCreate)("Leave the script name as 'foodnstuff'!");if(-1==(t=t.replace(/\s/g,"")).indexOf("while(true){hack('foodnstuff');}"))return void Object(C.dialogBoxCreate)("Please copy and paste the code from the tutorial!");let n=m.Player.getCurrentServer();for(var a=0;a=1&&(n=1);for(const n in e.dataMap)if(e.dataMap.hasOwnProperty(n)){if(0==e.dataMap[n][2]||null==e.dataMap[n][2])continue;const r=_.AllServers[n];if(null==r)continue;const a=Math.round(.5*e.dataMap[n][2]/e.onlineRunningTime*t);e.log(`Called on ${r.hostname} ${a} times while offline`);const i=Object(g.processSingleServerGrowth)(r,a,m.Player);e.log(`'${r.hostname}' grown by ${k.numeralWrapper.format(100*i-100,"0.000000%")} while offline`)}const r=n*(e.onlineExpGained/e.onlineRunningTime)*t;m.Player.gainHackingExp(r),e.offlineRunningTime+=t,e.offlineExpGained+=r;for(const n in e.dataMap)if(e.dataMap.hasOwnProperty(n)){if(0==e.dataMap[n][3]||null==e.dataMap[n][3])continue;const r=_.AllServers[n];if(null==r)continue;const a=Math.round(.5*e.dataMap[n][3]/e.onlineRunningTime*t);e.log(`Called weaken() on ${r.hostname} ${a} times while offline`),r.weaken(s.CONSTANTS.ServerWeakenAmount*a)}}function N(e,t,n){for(var r=0;rt&&(n=1),this.wanted=n,this.wanted<1&&(this.wanted=1)}else console.warn("ERROR: wantedLevelGains is NaN");"number"==typeof n?(t.gainMoney(n*e),t.recordMoneySource(n*e,"gang")):console.warn("ERROR: respectGains is NaN")},B.prototype.processTerritoryAndPowerGains=function(e=1){if(this.storedTerritoryAndPowerCycles+=e,this.storedTerritoryAndPowerCycles<100)return;this.storedTerritoryAndPowerCycles-=100;const t=this.facName;for(const e in N)if(N.hasOwnProperty(e))if(e==t)N[e].power+=this.calculatePower();else{const t=Math.random();if(t<.5){const t=.005*N[e].power;N[e].power+=Math.min(.85,t)}else{const n=.75*t*N[e].territory;N[e].power+=n}}this.territoryWarfareEngaged?this.territoryClashChance=1:this.territoryClashChance>0&&(this.territoryClashChance=Math.max(0,this.territoryClashChance-.01));for(let e=0;et!==R[e]),r=Object(_.getRandomInt)(0,n.length-1),a=R[e],i=n[r];if(!(a!==t&&i!==t||Math.random()=30)&&this.respect>=this.getRespectNeededToRecruitMember()},B.prototype.getRespectNeededToRecruitMember=function(){if(this.members.length<3)return 0;const e=this.members.length-2;return Math.round(.9*Math.pow(e,3)+Math.pow(e,2))},B.prototype.recruitMember=function(e){if(""===(e=String(e))||!this.canRecruitMember())return!1;if(this.members.filter(t=>t.name===e).length>=1)return!1;let t=new j(e);return this.members.push(t),c.routing.isOn(c.Page.Gang)&&(this.createGangMemberDisplayElement(t),this.updateGangContent()),!0},B.prototype.getWantedPenalty=function(){return this.respect/(this.respect+this.wanted)},B.prototype.processExperienceGains=function(e=1){for(var t=0;t=0;--e){const n=this.members[e];if("Territory Warfare"!==n.task)continue;const r=t/Math.pow(n.def,.6);Math.random()")):t.log(`Ascended Gang member ${e.name}`),c.routing.isOn(c.Page.Gang)&&this.displayGangMemberList(),n}catch(e){if(null!=t)throw e;Object(d.exceptionAlert)(e)}},B.prototype.getDiscount=function(){const e=this.getPower(),t=this.respect,n=Math.pow(t,.01)+t/5e6+Math.pow(e,.01)+e/1e6-1;return Math.max(1,n)},B.prototype.getAllTaskNames=function(){let e=[];const t=Object.keys(F);return e=this.isHackingGang?t.filter(e=>{let t=F[e];return null!=t&&("Unassigned"!==e&&t.isHacking)}):t.filter(e=>{let t=F[e];return null!=t&&("Unassigned"!==e&&t.isCombat)})},B.prototype.getAllUpgradeNames=function(){return Object.keys(H)},B.prototype.getUpgradeCost=function(e){return null==H[e]?1/0:H[e].getCost(this)},B.prototype.getUpgradeType=function(e){const t=H[e];if(null==t)return"";switch(t.type){case"w":return"Weapon";case"a":return"Armor";case"v":return"Vehicle";case"r":return"Rootkit";case"g":return"Augmentation";default:return""}},B.prototype.toJSON=function(){return Object(p.Generic_toJSON)("Gang",this)},B.fromJSON=function(e){return Object(p.Generic_fromJSON)(B,e.data)},p.Reviver.constructors.Gang=B,j.prototype.calculateSkill=function(e,t=1){return Math.max(Math.floor(t*(32*Math.log(e+534.5)-200)),1)},j.prototype.updateSkillLevels=function(){this.hack=this.calculateSkill(this.hack_exp,this.hack_mult*this.hack_asc_mult),this.str=this.calculateSkill(this.str_exp,this.str_mult*this.str_asc_mult),this.def=this.calculateSkill(this.def_exp,this.def_mult*this.def_asc_mult),this.dex=this.calculateSkill(this.dex_exp,this.dex_mult*this.dex_asc_mult),this.agi=this.calculateSkill(this.agi_exp,this.agi_mult*this.agi_asc_mult),this.cha=this.calculateSkill(this.cha_exp,this.cha_mult*this.cha_asc_mult)},j.prototype.calculatePower=function(){return(this.hack+this.str+this.def+this.dex+this.agi+this.cha)/95},j.prototype.assignToTask=function(e){return F.hasOwnProperty(e)?(this.task=e,!0):(this.task="Unassigned",!1)},j.prototype.unassignFromTask=function(){this.task="Unassigned"},j.prototype.getTask=function(){return this.task instanceof W&&(this.task=this.task.name),F.hasOwnProperty(this.task)?F[this.task]:F.Unassigned},j.prototype.calculateRespectGain=function(e){const t=this.getTask();if(null==t||!(t instanceof W)||0===t.baseRespect)return 0;var n=t.hackWeight/100*this.hack+t.strWeight/100*this.str+t.defWeight/100*this.def+t.dexWeight/100*this.dex+t.agiWeight/100*this.agi+t.chaWeight/100*this.cha;if((n-=4*t.difficulty)<=0)return 0;const r=Math.pow(100*N[e.facName].territory,t.territory.respect)/100;if(isNaN(r)||r<=0)return 0;var a=e.getWantedPenalty();return 11*t.baseRespect*n*r*a},j.prototype.calculateWantedLevelGain=function(e){const t=this.getTask();if(null==t||!(t instanceof W)||0===t.baseWanted)return 0;let n=t.hackWeight/100*this.hack+t.strWeight/100*this.str+t.defWeight/100*this.def+t.dexWeight/100*this.dex+t.agiWeight/100*this.agi+t.chaWeight/100*this.cha;if((n-=3.5*t.difficulty)<=0)return 0;const r=Math.pow(100*N[e.facName].territory,t.territory.wanted)/100;if(isNaN(r)||r<=0)return 0;if(t.baseWanted<0)return.4*t.baseWanted*n*r;{const e=7*t.baseWanted/Math.pow(3*n*r,.8);return Math.min(100,e)}},j.prototype.calculateMoneyGain=function(e){const t=this.getTask();if(null==t||!(t instanceof W)||0===t.baseMoney)return 0;var n=t.hackWeight/100*this.hack+t.strWeight/100*this.str+t.defWeight/100*this.def+t.dexWeight/100*this.dex+t.agiWeight/100*this.agi+t.chaWeight/100*this.cha;if((n-=3.2*t.difficulty)<=0)return 0;const r=Math.pow(100*N[e.facName].territory,t.territory.money)/100;if(isNaN(r)||r<=0)return 0;var a=e.getWantedPenalty();return 5*t.baseMoney*n*r*a},j.prototype.gainExperience=function(e=1){const t=this.getTask();if(null==t||!(t instanceof W)||t===F.Unassigned)return;const n=Math.pow(t.difficulty,.9)*e;this.hack_exp+=t.hackWeight/1500*n,this.str_exp+=t.strWeight/1500*n,this.def_exp+=t.defWeight/1500*n,this.dex_exp+=t.dexWeight/1500*n,this.agi_exp+=t.agiWeight/1500*n,this.cha_exp+=t.chaWeight/1500*n},j.prototype.recordEarnedRespect=function(e=1,t){this.earnedRespect+=this.calculateRespectGain(t)*e},j.prototype.ascend=function(){const e=this.getAscensionResults(),t=e.hack,n=e.str,r=e.def,a=e.dex,i=e.agi,o=e.cha;this.hack_asc_mult+=t,this.str_asc_mult+=n,this.def_asc_mult+=r,this.dex_asc_mult+=a,this.agi_asc_mult+=i,this.cha_asc_mult+=o,this.upgrades.length=0,this.hack_mult=1,this.str_mult=1,this.def_mult=1,this.dex_mult=1,this.agi_mult=1,this.cha_mult=1;for(let e=0;e{!function(e,t,n,r,a){F[e]=new W(e,t,n,r,a)}(e.name,e.desc,e.isHacking,e.isCombat,e.params)}),U.prototype.getCost=function(e){const t=e.getDiscount();return this.cost/t},U.prototype.createDescription=function(){const e=["Increases:"];null!=this.mults.str&&e.push(`* Strength by ${Math.round(100*(this.mults.str-1))}%`),null!=this.mults.def&&e.push(`* Defense by ${Math.round(100*(this.mults.def-1))}%`),null!=this.mults.dex&&e.push(`* Dexterity by ${Math.round(100*(this.mults.dex-1))}%`),null!=this.mults.agi&&e.push(`* Agility by ${Math.round(100*(this.mults.agi-1))}%`),null!=this.mults.cha&&e.push(`* Charisma by ${Math.round(100*(this.mults.cha-1))}%`),null!=this.mults.hack&&e.push(`* Hacking by ${Math.round(100*(this.mults.hack-1))}%`),this.desc=e.join("
")},U.prototype.apply=function(e){null!=this.mults.str&&(e.str_mult*=this.mults.str),null!=this.mults.def&&(e.def_mult*=this.mults.def),null!=this.mults.dex&&(e.dex_mult*=this.mults.dex),null!=this.mults.agi&&(e.agi_mult*=this.mults.agi),null!=this.mults.cha&&(e.cha_mult*=this.mults.cha),null!=this.mults.hack&&(e.hack_mult*=this.mults.hack)},U.prototype.toJSON=function(){return Object(p.Generic_toJSON)("GangMemberUpgrade",this)},U.fromJSON=function(e){return Object(p.Generic_fromJSON)(U,e.data)},p.Reviver.constructors.GangMemberUpgrade=U;const H={};a.gangMemberUpgradesMetadata.forEach(e=>{!function(e,t,n,r){H[e]=new U(e,t,n,r)}(e.name,e.cost,e.upgType,e.mults)}),B.prototype.createGangMemberUpgradeBox=function(e,t=""){const n="gang-member-upgrade-popup-box";if(G.gangMemberUpgradeBoxOpened){if(null==G.gangMemberUpgradeBoxElements||null==G.gangMemberUpgradeBox||null==G.gangMemberUpgradeBoxContent)return void console.error("Refreshing Gang member upgrade box throws error because required elements are null");for(var r=2;r-1||this.members[r].task.indexOf(a)>-1){var i=this.members[r].createGangMemberUpgradePanel(this,e);G.gangMemberUpgradeBoxContent.appendChild(i),G.gangMemberUpgradeBoxElements.push(i)}}else{G.gangMemberUpgradeBoxFilter=Object(f.createElement)("input",{type:"text",placeholder:"Filter gang members",class:"text-input",value:t,onkeyup:()=>{var t=G.gangMemberUpgradeBoxFilter.value.toString();this.createGangMemberUpgradeBox(e,t)}}),G.gangMemberUpgradeBoxDiscount=Object(f.createElement)("p",{innerText:"Discount: -"+u.numeralWrapper.formatPercentage(1-1/this.getDiscount()),marginLeft:"6px",tooltip:"You get a discount on equipment and upgrades based on your gang's respect and power. More respect and power leads to more discounts."}),G.gangMemberUpgradeBoxElements=[G.gangMemberUpgradeBoxFilter,G.gangMemberUpgradeBoxDiscount];for(a=G.gangMemberUpgradeBoxFilter.value.toString(),r=0;r-1||this.members[r].task.indexOf(a)>-1)&&G.gangMemberUpgradeBoxElements.push(this.members[r].createGangMemberUpgradePanel(this,e));G.gangMemberUpgradeBox=Object(b.createPopup)(n,G.gangMemberUpgradeBoxElements),G.gangMemberUpgradeBoxContent=document.getElementById(n+"-content"),G.gangMemberUpgradeBoxOpened=!0}},j.prototype.createGangMemberUpgradePanel=function(e,t){var n=Object(f.createElement)("div",{border:"1px solid white"}),r=Object(f.createElement)("h1",{innerText:this.name+" ("+this.task+")"});n.appendChild(r);var a=Object(f.createElement)("pre",{fontSize:"14px",display:"inline-block",width:"20%",innerText:"Hack: "+this.hack+" (x"+Object(h.formatNumber)(this.hack_mult*this.hack_asc_mult,2)+")\nStr: "+this.str+" (x"+Object(h.formatNumber)(this.str_mult*this.str_asc_mult,2)+")\nDef: "+this.def+" (x"+Object(h.formatNumber)(this.def_mult*this.def_asc_mult,2)+")\nDex: "+this.dex+" (x"+Object(h.formatNumber)(this.dex_mult*this.dex_asc_mult,2)+")\nAgi: "+this.agi+" (x"+Object(h.formatNumber)(this.agi_mult*this.agi_asc_mult,2)+")\nCha: "+this.cha+" (x"+Object(h.formatNumber)(this.cha_mult*this.cha_asc_mult,2)+")\n"});const i=[];function o(e){const t=H[e];null!=t?i.push(Object(f.createElement)("div",{class:"gang-owned-upgrade",innerText:e,tooltip:t.desc})):console.error(`Could not find GangMemberUpgrade object for name ${e}`)}for(const e of this.upgrades)o(e);for(const e of this.augmentations)o(e);var s=Object(f.createElement)("div",{class:"gang-owned-upgrades-div",innerText:"Purchased Upgrades:"});for(const e of i)s.appendChild(e);n.appendChild(a),n.appendChild(s),n.appendChild(Object(f.createElement)("br",{}));const l=[],c=[],u=[],m=[],p=[];for(let n in H)if(H.hasOwnProperty(n)){let r=H[n];if(t.money.lt(r.getCost(e)))continue;if(this.upgrades.includes(n)||this.augmentations.includes(n))continue;switch(r.type){case"w":l.push(r);break;case"a":c.push(r);break;case"v":u.push(r);break;case"r":m.push(r);break;case"g":p.push(r);break;default:console.error(`ERROR: Invalid Gang Member Upgrade Type: ${r.type}`)}}const d=Object(f.createElement)("div",{width:"20%",display:"inline-block"}),_=Object(f.createElement)("div",{width:"20%",display:"inline-block"}),g=Object(f.createElement)("div",{width:"20%",display:"inline-block"}),y=Object(f.createElement)("div",{width:"20%",display:"inline-block"}),b=Object(f.createElement)("div",{width:"20%",display:"inline-block"});d.appendChild(Object(f.createElement)("h2",{innerText:"Weapons"})),_.appendChild(Object(f.createElement)("h2",{innerText:"Armor"})),g.appendChild(Object(f.createElement)("h2",{innerText:"Vehicles"})),y.appendChild(Object(f.createElement)("h2",{innerText:"Rootkits"})),b.appendChild(Object(f.createElement)("h2",{innerText:"Augmentations"}));const E=[l,c,u,m,p],v=[d,_,g,y,b];for(let n=0;n(a.buyUpgrade(n,t,e),!1)};i>=3?s.tooltipleft=n.desc:s.tooltip=n.desc,r.appendChild(Object(f.createElement)("a",s))}(r[i],a,this,n,e)}}return n.appendChild(d),n.appendChild(_),n.appendChild(g),n.appendChild(y),n.appendChild(b),n};const G={gangContentCreated:!1,gangContainer:null,managementButton:null,territoryButton:null,gangManagementSubpage:null,gangTerritorySubpage:null,gangDesc:null,gangInfo:null,gangRecruitMemberButton:null,gangRecruitRequirementText:null,gangExpandAllButton:null,gangCollapseAllButton:null,gangMemberFilter:null,gangManageEquipmentButton:null,gangMemberList:null,gangMemberPanels:{},gangMemberUpgradeBoxOpened:!1,gangMemberUpgradeBox:null,gangMemberUpgradeBoxContent:null,gangMemberUpgradeBoxFilter:null,gangMemberUpgradeBoxDiscount:null,gangMemberUpgradeBoxElements:null,gangTerritoryDescText:null,gangTerritoryWarfareCheckbox:null,gangTerritoryWarfareCheckboxLabel:null,gangTerritoryWarfareClashChance:null,gangTerritoryDeathNotifyCheckbox:null,gangTerritoryDeathNotifyCheckboxLabel:null,gangTerritoryInfoText:null};B.prototype.displayGangContent=function(e){if(!G.gangContentCreated||null==G.gangContainer){G.gangContentCreated=!0,G.gangContainer=Object(f.createElement)("div",{id:"gang-container",class:"generic-menupage-container"});var t=this.facName;G.gangContainer.appendChild(Object(f.createElement)("a",{class:"a-link-button",display:"inline-block",innerText:"Back",clickListener:()=>(i.Engine.loadFactionContent(),Object(l.displayFactionContent)(t),!1)})),G.managementButton=Object(f.createElement)("a",{id:"gang-management-subpage-button",class:"a-link-button-inactive",display:"inline-block",innerHTML:"Gang Management (Alt+1)",clickListener:()=>(G.gangManagementSubpage.style.display="block",G.gangTerritorySubpage.style.display="none",G.managementButton.classList.toggle("a-link-button-inactive"),G.managementButton.classList.toggle("a-link-button"),G.territoryButton.classList.toggle("a-link-button-inactive"),G.territoryButton.classList.toggle("a-link-button"),this.updateGangContent(),!1)}),G.territoryButton=Object(f.createElement)("a",{id:"gang-territory-subpage-button",class:"a-link-button",display:"inline-block",innerHTML:"Gang Territory (Alt+2)",clickListener:()=>(G.gangManagementSubpage.style.display="none",G.gangTerritorySubpage.style.display="block",G.managementButton.classList.toggle("a-link-button-inactive"),G.managementButton.classList.toggle("a-link-button"),G.territoryButton.classList.toggle("a-link-button-inactive"),G.territoryButton.classList.toggle("a-link-button"),this.updateGangContent(),!1)}),G.gangContainer.appendChild(G.managementButton),G.gangContainer.appendChild(G.territoryButton),G.gangManagementSubpage=Object(f.createElement)("div",{display:"block",id:"gang-management-subpage"});var n="";n=this.isHackingGang?"Ethical Hacking":"Vigilante Justice",G.gangDesc=Object(f.createElement)("p",{width:"70%",innerHTML:"This page is used to manage your gang members and get an overview of your gang's stats.

If a gang member is not earning much money or respect, the task that you have assigned to that member might be too difficult. Consider training that member's stats or choosing an easier task. The tasks closer to the top of the dropdown list are generally easier. Alternatively, the gang member's low production might be due to the fact that your wanted level is too high. Consider assigning a few members to the '"+n+"' task to lower your wanted level.

Installing Augmentations does NOT reset your progress with your Gang. Furthermore, after installing Augmentations, you will automatically be a member of whatever Faction you created your gang with.

You can also manage your gang programmatically through Netscript using the Gang API"}),G.gangManagementSubpage.appendChild(G.gangDesc),G.gangInfo=Object(f.createElement)("p",{id:"gang-info",width:"70%"}),G.gangManagementSubpage.appendChild(G.gangInfo),G.gangRecruitMemberButton=Object(f.createElement)("a",{id:"gang-management-recruit-member-btn",class:"a-link-button-inactive",innerHTML:"Recruit Gang Member",display:"inline-block",margin:"10px",clickListener:()=>{const e="recruit-gang-member-popup";let t;const n=Object(f.createElement)("p",{innerText:"Please enter a name for your new Gang member:"}),r=Object(f.createElement)("br"),a=Object(f.createElement)("input",{onkeyup:e=>{e.keyCode===g.KEY.ENTER&&t.click()},placeholder:"Name must be unique",type:"text",class:"text-input"});t=Object(f.createElement)("a",{class:"std-button",clickListener:()=>{let t=a.value;return""===t?(Object(m.dialogBoxCreate)("You must enter a name for your Gang member!"),!1):this.canRecruitMember()?this.recruitMember(t)?(Object(k.removeElementById)(e),!1):(Object(m.dialogBoxCreate)("You already have a gang member with this name!"),!1):(Object(m.dialogBoxCreate)("You cannot recruit another Gang member!"),!1)},innerText:"Recruit Gang Member"});const i=Object(f.createElement)("a",{class:"std-button",clickListener:()=>(Object(k.removeElementById)(e),!1),innerText:"Cancel"});Object(b.createPopup)(e,[n,r,a,t,i]),a.focus()}}),G.gangManagementSubpage.appendChild(G.gangRecruitMemberButton),G.gangRecruitRequirementText=Object(f.createElement)("p",{color:"red",id:"gang-recruit-requirement-text",margin:"10px"}),G.gangManagementSubpage.appendChild(G.gangRecruitRequirementText),G.gangManagementSubpage.appendChild(Object(f.createElement)("br",{})),G.gangExpandAllButton=Object(f.createElement)("a",{class:"a-link-button",display:"inline-block",innerHTML:"Expand All",clickListener:()=>{for(var e=G.gangManagementSubpage.getElementsByClassName("accordion-header"),t=0;t{for(var e=G.gangManagementSubpage.getElementsByClassName("accordion-header"),t=0;t{this.displayGangMemberList()}}),G.gangManageEquipmentButton=Object(f.createElement)("a",{class:"a-link-button",display:"inline-block",innerHTML:"Manage Equipment",clickListener:()=>{this.createGangMemberUpgradeBox(e)}}),G.gangManagementSubpage.appendChild(G.gangExpandAllButton),G.gangManagementSubpage.appendChild(G.gangCollapseAllButton),G.gangManagementSubpage.appendChild(G.gangMemberFilter),G.gangManagementSubpage.appendChild(G.gangManageEquipmentButton),G.gangMemberList=Object(f.createElement)("ul",{id:"gang-member-list"}),this.displayGangMemberList(),G.gangManagementSubpage.appendChild(G.gangMemberList),G.gangTerritorySubpage=Object(f.createElement)("div",{id:"gang-territory-subpage",display:"none"}),G.gangTerritoryDescText=Object(f.createElement)("p",{width:"70%",innerHTML:"This page shows how much territory your Gang controls. This statistic is listed as a percentage, which represents how much of the total territory you control.

Every ~20 seconds, your gang has a chance to 'clash' with other gangs. Your chance to win a clash depends on your gang's power, which is listed in the display below. Your gang's power slowly accumulates over time. The accumulation rate is determined by the stats of all Gang members you have assigned to the 'Territory Warfare' task. Gang members that are not assigned to this task do not contribute to your gang's power. Your gang also loses a small amount of power whenever you lose a clash

NOTE: Gang members assigned to 'Territory Warfare' can be killed during clashes. This can happen regardless of whether you win or lose the clash. A gang member being killed results in both respect and power loss for your gang.

The amount of territory you have affects all aspects of your Gang members' production, including money, respect, and wanted level. It is very beneficial to have high territory control.

"}),G.gangTerritorySubpage.appendChild(G.gangTerritoryDescText),G.gangTerritoryWarfareCheckbox=Object(f.createElement)("input",{display:"inline-block",id:"gang-management-territory-warfare-checkbox",changeListener:()=>{this.territoryWarfareEngaged=G.gangTerritoryWarfareCheckbox.checked},margin:"2px",type:"checkbox"}),G.gangTerritoryWarfareCheckbox.checked=this.territoryWarfareEngaged,G.gangTerritoryWarfareCheckboxLabel=Object(f.createElement)("label",{color:"white",display:"inline-block",for:"gang-management-territory-warfare-checkbox",innerText:"Engage in Territory Warfare",tooltip:"Engaging in Territory Warfare sets your clash chance to 100%. Disengaging will cause your clash chance to gradually decrease until it reaches 0%"}),G.gangTerritorySubpage.appendChild(G.gangTerritoryWarfareCheckbox),G.gangTerritorySubpage.appendChild(G.gangTerritoryWarfareCheckboxLabel),G.gangTerritorySubpage.appendChild(Object(f.createElement)("br")),G.gangTerritoryWarfareClashChance=Object(f.createElement)("p",{display:"inline-block"}),G.gangTerritorySubpage.appendChild(G.gangTerritoryWarfareClashChance),G.gangTerritorySubpage.appendChild(Object(f.createElement)("div",{class:"help-tip",display:"inline-block",innerText:"?",clickListener:()=>{Object(m.dialogBoxCreate)("This percentage represents the chance you have of 'clashing' with with another gang. If you do not wish to gain/lose territory, then keep this percentage at 0% by not engaging in territory warfare.")}})),G.gangTerritoryDeathNotifyCheckbox=Object(f.createElement)("input",{display:"inline-block",id:"gang-management-notify-member-death-checkbox",changeListener:()=>{this.notifyMemberDeath=G.gangTerritoryDeathNotifyCheckbox.checked},margin:"2px",type:"checkbox"}),G.gangTerritoryDeathNotifyCheckbox.checked=this.notifyMemberDeath,G.gangTerritoryDeathNotifyCheckboxLabel=Object(f.createElement)("label",{color:"white",display:"inline-block",for:"gang-management-notify-member-death-checkbox",innerText:"Notify about Gang Member Deaths",tooltip:"If this is enabled, then you will receive a pop-up notifying you whenever one of your Gang Members dies in a territory clash."}),G.gangTerritorySubpage.appendChild(Object(f.createElement)("br")),G.gangTerritorySubpage.appendChild(G.gangTerritoryDeathNotifyCheckbox),G.gangTerritorySubpage.appendChild(G.gangTerritoryDeathNotifyCheckboxLabel),G.gangTerritorySubpage.appendChild(Object(f.createElement)("br"));var r=Object(f.createElement)("fieldset",{display:"block",margin:"6px",width:"50%"});G.gangTerritoryInfoText=Object(f.createElement)("p"),r.appendChild(G.gangTerritoryInfoText),G.gangTerritorySubpage.appendChild(r),G.gangContainer.appendChild(G.gangTerritorySubpage),G.gangContainer.appendChild(G.gangManagementSubpage),document.getElementById("entire-game-container").appendChild(G.gangContainer)}G.gangContainer.style.display="block",this.updateGangContent()},B.prototype.displayGangMemberList=function(){Object(E.removeChildrenFromElement)(G.gangMemberList),G.gangMemberPanels={};const e=this.members,t=G.gangMemberFilter.value.toString();for(var n=0;n-1||e[n].task.indexOf(t)>-1)&&this.createGangMemberDisplayElement(e[n])},B.prototype.updateGangContent=function(){if(G.gangContentCreated)if(G.gangMemberUpgradeBoxOpened&&(G.gangMemberUpgradeBoxDiscount.childNodes[0].nodeValue="Discount: -"+u.numeralWrapper.formatPercentage(1-1/this.getDiscount())),"block"===G.gangTerritorySubpage.style.display){G.gangTerritoryWarfareClashChance.innerText=`Territory Clash Chance: ${u.numeralWrapper.formatPercentage(this.territoryClashChance,3)}`,G.gangTerritoryWarfareCheckbox.checked=this.territoryWarfareEngaged,G.gangTerritoryInfoText.innerHTML="";const e=N[this.facName].power;let t=Object.keys(N).filter(e=>e!=this.facName);t.unshift(this.facName);for(const n of t)if(N.hasOwnProperty(n)){const t=N[n];let r,a=100*t.territory;if(r=a<=0?Object(h.formatNumber)(0,2):a>=100?Object(h.formatNumber)(100,2):Object(h.formatNumber)(a,2),n===this.facName){let e=`${n}
Power: ${Object(h.formatNumber)(t.power,6)}
`;e+=`Territory: ${r}%

`,G.gangTerritoryInfoText.innerHTML+=e}else{const a=e/(t.power+e);let i=`${n}
Power: ${Object(h.formatNumber)(t.power,6)}
`;i+=`Territory: ${r}%
`,i+=`Chance to win clash with this gang: ${u.numeralWrapper.formatPercentage(a,3)}

`,G.gangTerritoryInfoText.innerHTML+=i}}}else{if(G.gangInfo instanceof Element){var e,t=s.Factions[this.facName];e=t instanceof o.Faction?t.playerReputation:"ERROR",Object(E.removeChildrenFromElement)(G.gangInfo),G.gangInfo.appendChild(Object(f.createElement)("p",{display:"inline-block",innerText:"Respect: "+u.numeralWrapper.formatRespect(this.respect)+" ("+u.numeralWrapper.formatRespect(5*this.respectGainRate)+" / sec)",tooltip:"Represents the amount of respect your gang has from other gangs and criminal organizations. Your respect affects the amount of money your gang members will earn, and also determines how much reputation you are earning with your gang's corresponding Faction."})),G.gangInfo.appendChild(Object(f.createElement)("br")),G.gangInfo.appendChild(Object(f.createElement)("p",{display:"inline-block",innerText:"Wanted Level: "+u.numeralWrapper.formatWanted(this.wanted)+" ("+u.numeralWrapper.formatWanted(5*this.wantedGainRate)+" / sec)",tooltip:"Represents how much the gang is wanted by law enforcement. The higher your gang's wanted level, the harder it will be for your gang members to make money and earn respect. Note that the minimum wanted level is 1."})),G.gangInfo.appendChild(Object(f.createElement)("br"));var n=this.getWantedPenalty();n=100*(1-n),G.gangInfo.appendChild(Object(f.createElement)("p",{display:"inline-block",innerText:`Wanted Level Penalty: -${Object(h.formatNumber)(n,2)}%`,tooltip:"Penalty for respect and money gain rates due to Wanted Level"})),G.gangInfo.appendChild(Object(f.createElement)("br"));const a=Object(f.createElement)("div");w.a.render(M.a.createElement("p",{style:{display:"inline-block"}},"Money gain rate: ",Object(S.MoneyRate)(5*this.moneyGainRate)),a),G.gangInfo.appendChild(a),G.gangInfo.appendChild(Object(f.createElement)("br"));var r=100*N[this.facName].territory;let l;l=r<=0?Object(h.formatNumber)(0,2):r>=100?Object(h.formatNumber)(100,2):Object(h.formatNumber)(r,2),G.gangInfo.appendChild(Object(f.createElement)("p",{display:"inline-block",innerText:`Territory: ${Object(h.formatNumber)(l,3)}%`,tooltip:"The percentage of total territory your Gang controls"})),G.gangInfo.appendChild(Object(f.createElement)("br"));const c=Object(f.createElement)("div");w.a.render(M.a.createElement("p",{style:{display:"inline-block"}},"Faction reputation: ",Object(O.Reputation)(e)),c),G.gangInfo.appendChild(c),G.gangInfo.appendChild(Object(f.createElement)("br"));const m=1e3/i.Engine._idleSpeed;this.storedCycles/m*1e3>5e3&&(G.gangInfo.appendChild(Object(f.createElement)("p",{innerText:`Bonus time: ${Object(h.convertTimeMsToTimeElapsedString)(this.storedCycles/m*1e3)}`,display:"inline-block",tooltip:"You gain bonus time while offline or when the game is inactive (e.g. when the tab is throttled by the browser). Bonus time makes the Gang mechanic progress faster, up to 5x the normal speed"})),G.gangInfo.appendChild(Object(f.createElement)("br")))}else console.error("gang-info DOM element DNE");const a=this.members.length,l=this.getRespectNeededToRecruitMember(),c=G.gangRecruitMemberButton;a>=30?(c.className="a-link-button-inactive",G.gangRecruitRequirementText.style.display="inline-block",G.gangRecruitRequirementText.innerHTML="You have reached the maximum amount of gang members"):this.canRecruitMember()?(c.className="a-link-button",G.gangRecruitRequirementText.style.display="none"):(c.className="a-link-button-inactive",G.gangRecruitRequirementText.style.display="inline-block",G.gangRecruitRequirementText.innerHTML=`${Object(h.formatNumber)(l,2)} respect needed to recruit next member`);for(let e=0;e")});G.gangMemberPanels[t].statsDiv=i;const o=Object(f.createElement)("pre",{display:"inline",id:t+"gang-member-stats-text"}),s=Object(f.createElement)("br"),l=Object(f.createElement)("button",{class:"accordion-button",innerText:"Ascend",clickListener:()=>{const t=`gang-management-ascend-member ${e.name}`,n=e.getAscensionResults(),r=Object(f.createElement)("pre",{innerText:["Are you sure you want to ascend this member? They will lose all of","their non-Augmentation upgrades and their stats will reset back to 1.","",`Furthermore, your gang will lose ${u.numeralWrapper.formatRespect(e.earnedRespect)} respect`,"","In return, they will gain the following permanent boost to stat multipliers:\n",`Hacking: +${u.numeralWrapper.formatPercentage(n.hack)}`,`Strength: +${u.numeralWrapper.formatPercentage(n.str)}`,`Defense: +${u.numeralWrapper.formatPercentage(n.def)}`,`Dexterity: +${u.numeralWrapper.formatPercentage(n.dex)}`,`Agility: +${u.numeralWrapper.formatPercentage(n.agi)}`,`Charisma: +${u.numeralWrapper.formatPercentage(n.cha)}`].join("\n")}),a=Object(f.createElement)("button",{class:"std-button",clickListener:()=>(this.ascendMember(e),this.updateGangMemberDisplayElement(e),Object(k.removeElementById)(t),!1),innerText:"Ascend"}),i=Object(f.createElement)("button",{class:"std-button",clickListener:()=>(Object(k.removeElementById)(t),!1),innerText:"Cancel"});Object(b.createPopup)(t,[r,a,i])}}),c=Object(f.createElement)("div",{class:"help-tip",clickListener:()=>{Object(m.dialogBoxCreate)(["Ascending a Gang Member resets the member's progress and stats in exchange","for a permanent boost to their stat multipliers.","

The additional stat multiplier that the Gang Member gains upon ascension","is based on the amount of multipliers the member has from non-Augmentation Equipment.","

Upon ascension, the member will lose all of its non-Augmentation Equipment and your","gang will lose respect equal to the total respect earned by the member."].join(" "))},innerText:"?",marginTop:"5px"});i.appendChild(o),i.appendChild(s),i.appendChild(l),i.appendChild(c);const p=Object(f.createElement)("div",{class:"gang-member-info-div",id:t+"gang-member-task"}),h=Object(f.createElement)("select",{class:"dropdown",id:t+"gang-member-task-selector"});let d=this.getAllTaskNames();d.unshift("---");for(var _=0;_{var t=h.options[h.selectedIndex].text;e.assignToTask(t),this.setGangMemberTaskDescription(e,t),this.updateGangContent()}),F.hasOwnProperty(e.task)){var E=e.task,v=0;for(let e=0;e"))}var a=document.getElementById(t+"gang-member-gain-info");if(a){const t=[["Money:",Object(S.MoneyRate)(5*e.calculateMoneyGain(this))],["Respect:",`${u.numeralWrapper.formatRespect(5*e.calculateRespectGain(this))} / sec`],["Wanted Level:",`${u.numeralWrapper.formatWanted(5*e.calculateWantedLevelGain(this))} / sec`],["Total Respect:",`${u.numeralWrapper.formatRespect(e.earnedRespect)}`]];w.a.render(Object(C.StatsTable)(t),a)}const i=document.getElementById(t+"gang-member-task-selector");if(i){let t=this.getAllTaskNames();if(t.unshift("---"),F.hasOwnProperty(e.task)){const n=e.task;let r=0;for(let e=0;e["+(_Fconf_FconfSettings__WEBPACK_IMPORTED_MODULE_12__.FconfSettings.ENABLE_TIMESTAMPS?Object(_utils_helpers_getTimestamp__WEBPACK_IMPORTED_MODULE_36__.getTimestamp)()+" ":"")+_Player__WEBPACK_IMPORTED_MODULE_22__.Player.getCurrentServer().hostname+` ~${n}]> ${t}`),t.length>0&&(Terminal.resetTerminalInput(),Terminal.executeCommands(t))}if(e.keyCode===_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_34__.KEY.C&&e.ctrlKey&&(_engine__WEBPACK_IMPORTED_MODULE_11__.Engine._actionInProgress?(Object(_ui_postToTerminal__WEBPACK_IMPORTED_MODULE_39__.post)("Cancelling..."),_engine__WEBPACK_IMPORTED_MODULE_11__.Engine._actionInProgress=!1,Terminal.finishAction(!0)):_Fconf_FconfSettings__WEBPACK_IMPORTED_MODULE_12__.FconfSettings.ENABLE_BASH_HOTKEYS&&Terminal.resetTerminalInput()),e.keyCode===_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_34__.KEY.L&&e.ctrlKey&&(e.preventDefault(),Terminal.executeCommand("clear")),e.keyCode===_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_34__.KEY.UPARROW||_Fconf_FconfSettings__WEBPACK_IMPORTED_MODULE_12__.FconfSettings.ENABLE_BASH_HOTKEYS&&e.keyCode===_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_34__.KEY.P&&e.ctrlKey){if(_Fconf_FconfSettings__WEBPACK_IMPORTED_MODULE_12__.FconfSettings.ENABLE_BASH_HOTKEYS&&e.preventDefault(),null==t)return;var n=Terminal.commandHistoryIndex;if(0==(a=Terminal.commandHistory.length))return;(n<0||n>a)&&(Terminal.commandHistoryIndex=a),0!=n&&--Terminal.commandHistoryIndex;var r=Terminal.commandHistory[Terminal.commandHistoryIndex];t.value=r,Object(_utils_SetTimeoutRef__WEBPACK_IMPORTED_MODULE_31__.setTimeoutRef)(function(){t.selectionStart=t.selectionEnd=1e4},10)}if(e.keyCode===_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_34__.KEY.DOWNARROW||_Fconf_FconfSettings__WEBPACK_IMPORTED_MODULE_12__.FconfSettings.ENABLE_BASH_HOTKEYS&&e.keyCode===_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_34__.KEY.M&&e.ctrlKey){if(_Fconf_FconfSettings__WEBPACK_IMPORTED_MODULE_12__.FconfSettings.ENABLE_BASH_HOTKEYS&&e.preventDefault(),null==t)return;var a;n=Terminal.commandHistoryIndex;if(0==(a=Terminal.commandHistory.length))return;if((n<0||n>a)&&(Terminal.commandHistoryIndex=a),n==a||n==a-1)Terminal.commandHistoryIndex=a,t.value="";else{++Terminal.commandHistoryIndex;r=Terminal.commandHistory[Terminal.commandHistoryIndex];t.value=r}}if(e.keyCode===_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_34__.KEY.TAB){if(e.preventDefault(),null==t)return;let n=t.value;if(""==n)return;const r=n.lastIndexOf(";");-1!==r&&(n=n.slice(r+1));const a=(n=(n=n.trim()).replace(/\s\s+/g," ")).split(" ");let i=a.length-2;i<-1&&(i=0);const o=Object(_Terminal_determineAllPossibilitiesForTabCompletion__WEBPACK_IMPORTED_MODULE_1__.determineAllPossibilitiesForTabCompletion)(_Player__WEBPACK_IMPORTED_MODULE_22__.Player,n,i,Terminal.currDir);if(0==o.length)return;let s="",l="";if(0==a.length)return;1==a.length?l=a[0]:2==a.length?(l=a[0],s=a[1]):3==a.length?(l=a[0]+" "+a[1],s=a[2]):(s=a.pop(),l=a.join(" ")),Object(_Terminal_tabCompletion__WEBPACK_IMPORTED_MODULE_3__.tabCompletion)(l,s,o),t.focus()}_Fconf_FconfSettings__WEBPACK_IMPORTED_MODULE_12__.FconfSettings.ENABLE_BASH_HOTKEYS&&(e.keyCode===_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_34__.KEY.A&&e.ctrlKey&&(e.preventDefault(),Terminal.moveTextCursor("home")),e.keyCode===_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_34__.KEY.E&&e.ctrlKey&&(e.preventDefault(),Terminal.moveTextCursor("end")),e.keyCode===_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_34__.KEY.B&&e.ctrlKey&&(e.preventDefault(),Terminal.moveTextCursor("prevchar")),e.keyCode===_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_34__.KEY.B&&e.altKey&&(e.preventDefault(),Terminal.moveTextCursor("prevword")),e.keyCode===_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_34__.KEY.F&&e.ctrlKey&&(e.preventDefault(),Terminal.moveTextCursor("nextchar")),e.keyCode===_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_34__.KEY.F&&e.altKey&&(e.preventDefault(),Terminal.moveTextCursor("nextword")),e.keyCode!==_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_34__.KEY.H&&e.keyCode!==_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_34__.KEY.D||!e.ctrlKey||(Terminal.modifyInput("backspace"),e.preventDefault()))}});let terminalCtrlPressed=!1,shiftKeyPressed=!1;$(document).ready(function(){_ui_navigationTracking__WEBPACK_IMPORTED_MODULE_32__.routing.isOn(_ui_navigationTracking__WEBPACK_IMPORTED_MODULE_32__.Page.Terminal)&&$(".terminal-input").focus()}),$(document).keydown(function(e){if(_ui_navigationTracking__WEBPACK_IMPORTED_MODULE_32__.routing.isOn(_ui_navigationTracking__WEBPACK_IMPORTED_MODULE_32__.Page.Terminal))if(e.which==_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_34__.KEY.CTRL)terminalCtrlPressed=!0;else if(e.shiftKey)shiftKeyPressed=!0;else if(terminalCtrlPressed||shiftKeyPressed||Terminal.contractOpen);else{var t=document.getElementById("terminal-input-text-box");null!=t&&t.focus(),terminalCtrlPressed=!1,shiftKeyPressed=!1}}),$(document).keyup(function(e){_ui_navigationTracking__WEBPACK_IMPORTED_MODULE_32__.routing.isOn(_ui_navigationTracking__WEBPACK_IMPORTED_MODULE_32__.Page.Terminal)&&(e.which==_utils_helpers_keyCodes__WEBPACK_IMPORTED_MODULE_34__.KEY.CTRL&&(terminalCtrlPressed=!1),e.shiftKey&&(shiftKeyPressed=!1))});let Terminal={hackFlag:!1,backdoorFlag:!1,analyzeFlag:!1,actionStarted:!1,actionTime:0,commandHistory:[],commandHistoryIndex:0,contractOpen:!1,currDir:"/",resetTerminalInput:function(e=!1){let t="";e&&(t=getTerminalInput());const n=Terminal.currDir;_Fconf_FconfSettings__WEBPACK_IMPORTED_MODULE_12__.FconfSettings.WRAP_INPUT?(document.getElementById("terminal-input-td").innerHTML=`
[${_Player__WEBPACK_IMPORTED_MODULE_22__.Player.getCurrentServer().hostname} ~${n}]$
`+`",v.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue}();var xe=a.documentElement,we=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ke=/^([^.]*)(?:\.(.+)|)/;function Ee(){return!0}function Ae(){return!1}function _e(){try{return a.activeElement}catch(e){}}function Se(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Se(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Ae;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}k.event={global:{},add:function(e,t,n,r,i){var o,a,s,l,u,c,h,d,f,p,g,m=Q.get(e);if(m)for(n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(xe,i),n.guid||(n.guid=k.guid++),(l=m.events)||(l=m.events={}),(a=m.handle)||(a=m.handle=function(t){return void 0!==k&&k.event.triggered!==t.type?k.event.dispatch.apply(e,arguments):void 0}),u=(t=(t||"").match(I)||[""]).length;u--;)f=g=(s=ke.exec(t[u])||[])[1],p=(s[2]||"").split(".").sort(),f&&(h=k.event.special[f]||{},f=(i?h.delegateType:h.bindType)||f,h=k.event.special[f]||{},c=k.extend({type:f,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:p.join(".")},o),(d=l[f])||((d=l[f]=[]).delegateCount=0,h.setup&&!1!==h.setup.call(e,r,p,a)||e.addEventListener&&e.addEventListener(f,a)),h.add&&(h.add.call(e,c),c.handler.guid||(c.handler.guid=n.guid)),i?d.splice(d.delegateCount++,0,c):d.push(c),k.event.global[f]=!0)},remove:function(e,t,n,r,i){var o,a,s,l,u,c,h,d,f,p,g,m=Q.hasData(e)&&Q.get(e);if(m&&(l=m.events)){for(u=(t=(t||"").match(I)||[""]).length;u--;)if(f=g=(s=ke.exec(t[u])||[])[1],p=(s[2]||"").split(".").sort(),f){for(h=k.event.special[f]||{},d=l[f=(r?h.delegateType:h.bindType)||f]||[],s=s[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=d.length;o--;)c=d[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(d.splice(o,1),c.selector&&d.delegateCount--,h.remove&&h.remove.call(e,c));a&&!d.length&&(h.teardown&&!1!==h.teardown.call(e,p,m.handle)||k.removeEvent(e,f,m.handle),delete l[f])}else for(f in l)k.event.remove(e,f+t[u],n,r,!0);k.isEmptyObject(l)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),l=new Array(arguments.length),u=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(l[0]=s,t=1;t=1))for(;u!==this;u=u.parentNode||this)if(1===u.nodeType&&("click"!==e.type||!0!==u.disabled)){for(o=[],a={},n=0;n-1:k.find(i,this,null,[u]).length),a[i]&&o.push(r);o.length&&s.push({elem:u,handlers:o})}return u=this,l\x20\t\r\n\f]*)[^>]*)\/>/gi,De=/\s*$/g;function Le(e,t){return T(e,"table")&&T(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Be(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Me(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function je(e,t){var n,r,i,o,a,s,l,u;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),u=o.events))for(i in delete a.handle,a.events={},u)for(n=0,r=u[i].length;n1&&"string"==typeof p&&!v.checkClone&&Te.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),Pe(o,t,n,r)});if(d&&(o=(i=be(t,e[0].ownerDocument,!1,e,r)).firstChild,1===i.childNodes.length&&(i=o),o||r)){for(s=(a=k.map(me(i,"script"),Be)).length;h")},clone:function(e,t,n){var r,i,o,a,s=e.cloneNode(!0),l=k.contains(e.ownerDocument,e);if(!(v.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=me(s),r=0,i=(o=me(e)).length;r0&&ve(a,!l&&me(e,"script")),s},cleanData:function(e){for(var t,n,r,i=k.event.special,o=0;void 0!==(n=e[o]);o++)if(X(n)){if(t=n[Q.expando]){if(t.events)for(r in t.events)i[r]?k.event.remove(n,r):k.removeEvent(n,r,t.handle);n[Q.expando]=void 0}n[J.expando]&&(n[J.expando]=void 0)}}}),k.fn.extend({detach:function(e){return Ie(this,e,!0)},remove:function(e){return Ie(this,e)},text:function(e){return U(this,function(e){return void 0===e?k.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return Pe(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Le(this,e).appendChild(e)})},prepend:function(){return Pe(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Le(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return Pe(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(k.cleanData(me(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return k.clone(this,e,t)})},html:function(e){return U(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!De.test(e)&&!ge[(fe.exec(e)||["",""])[1].toLowerCase()]){e=k.htmlPrefilter(e);try{for(;n=0&&(l+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-l-s-.5))),l}function Je(e,t,n){var r=$e(e),i=ze(e,t,r),o="border-box"===k.css(e,"boxSizing",!1,r),a=o;if(Ne.test(i)){if(!n)return i;i="auto"}return a=a&&(v.boxSizingReliable()||i===e.style[t]),("auto"===i||!parseFloat(i)&&"inline"===k.css(e,"display",!1,r))&&(i=e["offset"+t[0].toUpperCase()+t.slice(1)],a=!0),(i=parseFloat(i)||0)+Qe(e,t,n||(o?"border":"content"),a,r,i)+"px"}function et(e,t,n,r,i){return new et.prototype.init(e,t,n,r,i)}k.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=ze(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=Y(t),l=Ue.test(t),u=e.style;if(l||(t=Xe(s)),a=k.cssHooks[t]||k.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:u[t];"string"===(o=typeof n)&&(i=ie.exec(n))&&i[1]&&(n=le(e,t,i),o="number"),null!=n&&n==n&&("number"===o&&(n+=i&&i[3]||(k.cssNumber[s]?"":"px")),v.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(l?u.setProperty(t,n):u[t]=n))}},css:function(e,t,n,r){var i,o,a,s=Y(t);return Ue.test(t)||(t=Xe(s)),(a=k.cssHooks[t]||k.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=ze(e,t,r)),"normal"===i&&t in Ke&&(i=Ke[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),k.each(["height","width"],function(e,t){k.cssHooks[t]={get:function(e,n,r){if(n)return!Ve.test(k.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,t,r):se(e,Ge,function(){return Je(e,t,r)})},set:function(e,n,r){var i,o=$e(e),a="border-box"===k.css(e,"boxSizing",!1,o),s=r&&Qe(e,t,r,a,o);return a&&v.scrollboxSize()===o.position&&(s-=Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-parseFloat(o[t])-Qe(e,t,"border",!1,o)-.5)),s&&(i=ie.exec(n))&&"px"!==(i[3]||"px")&&(e.style[t]=n,n=k.css(e,t)),Ze(0,n,s)}}}),k.cssHooks.marginLeft=He(v.reliableMarginLeft,function(e,t){if(t)return(parseFloat(ze(e,"marginLeft"))||e.getBoundingClientRect().left-se(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),k.each({margin:"",padding:"",border:"Width"},function(e,t){k.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+oe[r]+t]=o[r]||o[r-2]||o[0];return i}},"margin"!==e&&(k.cssHooks[e+t].set=Ze)}),k.fn.extend({css:function(e,t){return U(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=$e(e),i=t.length;a1)}}),k.Tween=et,et.prototype={constructor:et,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||k.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(k.cssNumber[n]?"":"px")},cur:function(){var e=et.propHooks[this.prop];return e&&e.get?e.get(this):et.propHooks._default.get(this)},run:function(e){var t,n=et.propHooks[this.prop];return this.options.duration?this.pos=t=k.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):et.propHooks._default.set(this),this}},et.prototype.init.prototype=et.prototype,et.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=k.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){k.fx.step[e.prop]?k.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[k.cssProps[e.prop]]&&!k.cssHooks[e.prop]?e.elem[e.prop]=e.now:k.style(e.elem,e.prop,e.now+e.unit)}}},et.propHooks.scrollTop=et.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},k.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},k.fx=et.prototype.init,k.fx.step={};var tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){nt&&(!1===a.hidden&&n.requestAnimationFrame?n.requestAnimationFrame(ot):n.setTimeout(ot,k.fx.interval),k.fx.tick())}function at(){return n.setTimeout(function(){tt=void 0}),tt=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=oe[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function lt(e,t,n){for(var r,i=(ut.tweeners[t]||[]).concat(ut.tweeners["*"]),o=0,a=i.length;o1)},removeAttr:function(e){return this.each(function(){k.removeAttr(this,e)})}}),k.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return void 0===e.getAttribute?k.prop(e,t,n):(1===o&&k.isXMLDoc(e)||(i=k.attrHooks[t.toLowerCase()]||(k.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void k.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=k.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!v.radioValue&&"radio"===t&&T(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(I);if(i&&1===e.nodeType)for(;n=i[r++];)e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?k.removeAttr(e,n):e.setAttribute(n,n),n}},k.each(k.expr.match.bool.source.match(/\w+/g),function(e,t){var n=ht[t]||k.find.attr;ht[t]=function(e,t,r){var i,o,a=t.toLowerCase();return r||(o=ht[a],ht[a]=i,i=null!=n(e,t,r)?a:null,ht[a]=o),i}});var dt=/^(?:input|select|textarea|button)$/i,ft=/^(?:a|area)$/i;function pt(e){return(e.match(I)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function mt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(I)||[]}k.fn.extend({prop:function(e,t){return U(this,k.prop,e,t,arguments.length>1)},removeProp:function(e){return this.each(function(){delete this[k.propFix[e]||e]})}}),k.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&k.isXMLDoc(e)||(t=k.propFix[t]||t,i=k.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=k.find.attr(e,"tabindex");return t?parseInt(t,10):dt.test(e.nodeName)||ft.test(e.nodeName)&&e.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),v.optSelected||(k.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),k.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){k.propFix[this.toLowerCase()]=this}),k.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,l=0;if(y(e))return this.each(function(t){k(this).addClass(e.call(this,t,gt(this)))});if((t=mt(e)).length)for(;n=this[l++];)if(i=gt(n),r=1===n.nodeType&&" "+pt(i)+" "){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=pt(r))&&n.setAttribute("class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,l=0;if(y(e))return this.each(function(t){k(this).removeClass(e.call(this,t,gt(this)))});if(!arguments.length)return this.attr("class","");if((t=mt(e)).length)for(;n=this[l++];)if(i=gt(n),r=1===n.nodeType&&" "+pt(i)+" "){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");i!==(s=pt(r))&&n.setAttribute("class",s)}return this},toggleClass:function(e,t){var n=typeof e,r="string"===n||Array.isArray(e);return"boolean"==typeof t&&r?t?this.addClass(e):this.removeClass(e):y(e)?this.each(function(n){k(this).toggleClass(e.call(this,n,gt(this),t),t)}):this.each(function(){var t,i,o,a;if(r)for(i=0,o=k(this),a=mt(e);t=a[i++];)o.hasClass(t)?o.removeClass(t):o.addClass(t);else void 0!==e&&"boolean"!==n||((t=gt(this))&&Q.set(this,"__className__",t),this.setAttribute&&this.setAttribute("class",t||!1===e?"":Q.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+pt(gt(n))+" ").indexOf(t)>-1)return!0;return!1}});var vt=/\r/g;k.fn.extend({val:function(e){var t,n,r,i=this[0];return arguments.length?(r=y(e),this.each(function(n){var i;1===this.nodeType&&(null==(i=r?e.call(this,n,k(this).val()):e)?i="":"number"==typeof i?i+="":Array.isArray(i)&&(i=k.map(i,function(e){return null==e?"":e+""})),(t=k.valHooks[this.type]||k.valHooks[this.nodeName.toLowerCase()])&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))})):i?(t=k.valHooks[i.type]||k.valHooks[i.nodeName.toLowerCase()])&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:"string"==typeof(n=i.value)?n.replace(vt,""):null==n?"":n:void 0}}),k.extend({valHooks:{option:{get:function(e){var t=k.find.attr(e,"value");return null!=t?t:pt(k.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],l=a?o+1:i.length;for(r=o<0?l:a?o:0;r-1)&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),k.each(["radio","checkbox"],function(){k.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=k.inArray(k(e).val(),t)>-1}},v.checkOn||(k.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),v.focusin="onfocusin"in n;var yt=/^(?:focusinfocus|focusoutblur)$/,bt=function(e){e.stopPropagation()};k.extend(k.event,{trigger:function(e,t,r,i){var o,s,l,u,c,h,d,f,g=[r||a],m=p.call(e,"type")?e.type:e,v=p.call(e,"namespace")?e.namespace.split("."):[];if(s=f=l=r=r||a,3!==r.nodeType&&8!==r.nodeType&&!yt.test(m+k.event.triggered)&&(m.indexOf(".")>-1&&(m=(v=m.split(".")).shift(),v.sort()),c=m.indexOf(":")<0&&"on"+m,(e=e[k.expando]?e:new k.Event(m,"object"==typeof e&&e)).isTrigger=i?2:3,e.namespace=v.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+v.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=r),t=null==t?[e]:k.makeArray(t,[e]),d=k.event.special[m]||{},i||!d.trigger||!1!==d.trigger.apply(r,t))){if(!i&&!d.noBubble&&!b(r)){for(u=d.delegateType||m,yt.test(u+m)||(s=s.parentNode);s;s=s.parentNode)g.push(s),l=s;l===(r.ownerDocument||a)&&g.push(l.defaultView||l.parentWindow||n)}for(o=0;(s=g[o++])&&!e.isPropagationStopped();)f=s,e.type=o>1?u:d.bindType||m,(h=(Q.get(s,"events")||{})[e.type]&&Q.get(s,"handle"))&&h.apply(s,t),(h=c&&s[c])&&h.apply&&X(s)&&(e.result=h.apply(s,t),!1===e.result&&e.preventDefault());return e.type=m,i||e.isDefaultPrevented()||d._default&&!1!==d._default.apply(g.pop(),t)||!X(r)||c&&y(r[m])&&!b(r)&&((l=r[c])&&(r[c]=null),k.event.triggered=m,e.isPropagationStopped()&&f.addEventListener(m,bt),r[m](),e.isPropagationStopped()&&f.removeEventListener(m,bt),k.event.triggered=void 0,l&&(r[c]=l)),e.result}},simulate:function(e,t,n){var r=k.extend(new k.Event,n,{type:e,isSimulated:!0});k.event.trigger(r,null,t)}}),k.fn.extend({trigger:function(e,t){return this.each(function(){k.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return k.event.trigger(e,t,n,!0)}}),v.focusin||k.each({focus:"focusin",blur:"focusout"},function(e,t){var n=function(e){k.event.simulate(t,e.target,k.event.fix(e))};k.event.special[t]={setup:function(){var r=this.ownerDocument||this,i=Q.access(r,t);i||r.addEventListener(e,n,!0),Q.access(r,t,(i||0)+1)},teardown:function(){var r=this.ownerDocument||this,i=Q.access(r,t)-1;i?Q.access(r,t,i):(r.removeEventListener(e,n,!0),Q.remove(r,t))}}});var xt=n.location,wt=Date.now(),Ct=/\?/;k.parseXML=function(e){var t;if(!e||"string"!=typeof e)return null;try{t=(new n.DOMParser).parseFromString(e,"text/xml")}catch(e){t=void 0}return t&&!t.getElementsByTagName("parsererror").length||k.error("Invalid XML: "+e),t};var kt=/\[\]$/,Et=/\r?\n/g,At=/^(?:submit|button|image|reset|file)$/i,_t=/^(?:input|select|textarea|keygen)/i;function St(e,t,n,r){var i;if(Array.isArray(t))k.each(t,function(t,i){n||kt.test(e)?r(e,i):St(e+"["+("object"==typeof i&&null!=i?t:"")+"]",i,n,r)});else if(n||"object"!==C(t))r(e,t);else for(i in t)St(e+"["+i+"]",t[i],n,r)}k.param=function(e,t){var n,r=[],i=function(e,t){var n=y(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(Array.isArray(e)||e.jquery&&!k.isPlainObject(e))k.each(e,function(){i(this.name,this.value)});else for(n in e)St(n,e[n],t,i);return r.join("&")},k.fn.extend({serialize:function(){return k.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=k.prop(this,"elements");return e?k.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!k(this).is(":disabled")&&_t.test(this.nodeName)&&!At.test(e)&&(this.checked||!de.test(e))}).map(function(e,t){var n=k(this).val();return null==n?null:Array.isArray(n)?k.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Ft=/%20/g,Dt=/#.*$/,Tt=/([?&])_=[^&]*/,Ot=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Bt=/^\/\//,Mt={},jt={},Rt="*/".concat("*"),Pt=a.createElement("a");function It(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(I)||[];if(y(n))for(;r=o[i++];)"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function Nt(e,t,n,r){var i={},o=e===jt;function a(s){var l;return i[s]=!0,k.each(e[s]||[],function(e,s){var u=s(t,n,r);return"string"!=typeof u||o||i[u]?o?!(l=u):void 0:(t.dataTypes.unshift(u),a(u),!1)}),l}return a(t.dataTypes[0])||!i["*"]&&a("*")}function $t(e,t){var n,r,i=k.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&k.extend(!0,e,r),e}Pt.href=xt.href,k.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:xt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(xt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":k.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?$t($t(e,k.ajaxSettings),t):$t(k.ajaxSettings,e)},ajaxPrefilter:It(Mt),ajaxTransport:It(jt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var r,i,o,s,l,u,c,h,d,f,p=k.ajaxSetup({},t),g=p.context||p,m=p.context&&(g.nodeType||g.jquery)?k(g):k.event,v=k.Deferred(),y=k.Callbacks("once memory"),b=p.statusCode||{},x={},w={},C="canceled",E={readyState:0,getResponseHeader:function(e){var t;if(c){if(!s)for(s={};t=Ot.exec(o);)s[t[1].toLowerCase()]=t[2];t=s[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return c?o:null},setRequestHeader:function(e,t){return null==c&&(e=w[e.toLowerCase()]=w[e.toLowerCase()]||e,x[e]=t),this},overrideMimeType:function(e){return null==c&&(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(c)E.always(e[E.status]);else for(t in e)b[t]=[b[t],e[t]];return this},abort:function(e){var t=e||C;return r&&r.abort(t),A(0,t),this}};if(v.promise(E),p.url=((e||p.url||xt.href)+"").replace(Bt,xt.protocol+"//"),p.type=t.method||t.type||p.method||p.type,p.dataTypes=(p.dataType||"*").toLowerCase().match(I)||[""],null==p.crossDomain){u=a.createElement("a");try{u.href=p.url,u.href=u.href,p.crossDomain=Pt.protocol+"//"+Pt.host!=u.protocol+"//"+u.host}catch(e){p.crossDomain=!0}}if(p.data&&p.processData&&"string"!=typeof p.data&&(p.data=k.param(p.data,p.traditional)),Nt(Mt,p,t,E),c)return E;for(d in(h=k.event&&p.global)&&0==k.active++&&k.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Lt.test(p.type),i=p.url.replace(Dt,""),p.hasContent?p.data&&p.processData&&0===(p.contentType||"").indexOf("application/x-www-form-urlencoded")&&(p.data=p.data.replace(Ft,"+")):(f=p.url.slice(i.length),p.data&&(p.processData||"string"==typeof p.data)&&(i+=(Ct.test(i)?"&":"?")+p.data,delete p.data),!1===p.cache&&(i=i.replace(Tt,"$1"),f=(Ct.test(i)?"&":"?")+"_="+wt+++f),p.url=i+f),p.ifModified&&(k.lastModified[i]&&E.setRequestHeader("If-Modified-Since",k.lastModified[i]),k.etag[i]&&E.setRequestHeader("If-None-Match",k.etag[i])),(p.data&&p.hasContent&&!1!==p.contentType||t.contentType)&&E.setRequestHeader("Content-Type",p.contentType),E.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Rt+"; q=0.01":""):p.accepts["*"]),p.headers)E.setRequestHeader(d,p.headers[d]);if(p.beforeSend&&(!1===p.beforeSend.call(g,E,p)||c))return E.abort();if(C="abort",y.add(p.complete),E.done(p.success),E.fail(p.error),r=Nt(jt,p,t,E)){if(E.readyState=1,h&&m.trigger("ajaxSend",[E,p]),c)return E;p.async&&p.timeout>0&&(l=n.setTimeout(function(){E.abort("timeout")},p.timeout));try{c=!1,r.send(x,A)}catch(e){if(c)throw e;A(-1,e)}}else A(-1,"No Transport");function A(e,t,a,s){var u,d,f,x,w,C=t;c||(c=!0,l&&n.clearTimeout(l),r=void 0,o=s||"",E.readyState=e>0?4:0,u=e>=200&&e<300||304===e,a&&(x=function(e,t,n){for(var r,i,o,a,s=e.contents,l=e.dataTypes;"*"===l[0];)l.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){l.unshift(i);break}if(l[0]in n)o=l[0];else{for(i in n){if(!l[0]||e.converters[i+" "+l[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==l[0]&&l.unshift(o),n[o]}(p,E,a)),x=function(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];for(o=c.shift();o;)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(!(a=u[l+" "+o]||u["* "+o]))for(i in u)if((s=i.split(" "))[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){!0===a?a=u[i]:!0!==u[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e.throws)t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}(p,x,E,u),u?(p.ifModified&&((w=E.getResponseHeader("Last-Modified"))&&(k.lastModified[i]=w),(w=E.getResponseHeader("etag"))&&(k.etag[i]=w)),204===e||"HEAD"===p.type?C="nocontent":304===e?C="notmodified":(C=x.state,d=x.data,u=!(f=x.error))):(f=C,!e&&C||(C="error",e<0&&(e=0))),E.status=e,E.statusText=(t||C)+"",u?v.resolveWith(g,[d,C,E]):v.rejectWith(g,[E,C,f]),E.statusCode(b),b=void 0,h&&m.trigger(u?"ajaxSuccess":"ajaxError",[E,p,u?d:f]),y.fireWith(g,[E,C]),h&&(m.trigger("ajaxComplete",[E,p]),--k.active||k.event.trigger("ajaxStop")))}return E},getJSON:function(e,t,n){return k.get(e,t,n,"json")},getScript:function(e,t){return k.get(e,void 0,t,"script")}}),k.each(["get","post"],function(e,t){k[t]=function(e,n,r,i){return y(n)&&(i=i||r,r=n,n=void 0),k.ajax(k.extend({url:e,type:t,dataType:i,data:n,success:r},k.isPlainObject(e)&&e))}}),k._evalUrl=function(e){return k.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,throws:!0})},k.fn.extend({wrapAll:function(e){var t;return this[0]&&(y(e)&&(e=e.call(this[0])),t=k(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstElementChild;)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(e){return y(e)?this.each(function(t){k(this).wrapInner(e.call(this,t))}):this.each(function(){var t=k(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=y(e);return this.each(function(n){k(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(e){return this.parent(e).not("body").each(function(){k(this).replaceWith(this.childNodes)}),this}}),k.expr.pseudos.hidden=function(e){return!k.expr.pseudos.visible(e)},k.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},k.ajaxSettings.xhr=function(){try{return new n.XMLHttpRequest}catch(e){}};var Wt={0:200,1223:204},zt=k.ajaxSettings.xhr();v.cors=!!zt&&"withCredentials"in zt,v.ajax=zt=!!zt,k.ajaxTransport(function(e){var t,r;if(v.cors||zt&&!e.crossDomain)return{send:function(i,o){var a,s=e.xhr();if(s.open(e.type,e.url,e.async,e.username,e.password),e.xhrFields)for(a in e.xhrFields)s[a]=e.xhrFields[a];for(a in e.mimeType&&s.overrideMimeType&&s.overrideMimeType(e.mimeType),e.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest"),i)s.setRequestHeader(a,i[a]);t=function(e){return function(){t&&(t=r=s.onload=s.onerror=s.onabort=s.ontimeout=s.onreadystatechange=null,"abort"===e?s.abort():"error"===e?"number"!=typeof s.status?o(0,"error"):o(s.status,s.statusText):o(Wt[s.status]||s.status,s.statusText,"text"!==(s.responseType||"text")||"string"!=typeof s.responseText?{binary:s.response}:{text:s.responseText},s.getAllResponseHeaders()))}},s.onload=t(),r=s.onerror=s.ontimeout=t("error"),void 0!==s.onabort?s.onabort=r:s.onreadystatechange=function(){4===s.readyState&&n.setTimeout(function(){t&&r()})},t=t("abort");try{s.send(e.hasContent&&e.data||null)}catch(e){if(t)throw e}},abort:function(){t&&t()}}}),k.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),k.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return k.globalEval(e),e}}}),k.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),k.ajaxTransport("script",function(e){var t,n;if(e.crossDomain)return{send:function(r,i){t=k("