From 2d374093922c0f0a19fff26df41f9f4e036605ab Mon Sep 17 00:00:00 2001
From: danielyxie
+ Below is a list of all Augmentations you have purchased but not
+ yet installed. Click the button below to install them.
+
+ WARNING: Installing your Augmentations resets most of your progress,
+ including:
+ - Stats/Skill levels and Experience - Money - Scripts on every computer but your home computer - Purchased servers - Hacknet Nodes - Faction/Company reputation - Stocks
+ Installing Augmentations lets you start over with the perks and
+ benefits granted by all of the Augmentations you have ever
+ installed. Also, you will keep any scripts and RAM/Core upgrades
+ on your home computer (but you will lose all programs besides
+ NUKE.exe)
+ {augs}
+ )
+}
diff --git a/src/Augmentation/ui/InstalledAugmentationsAndSourceFiles.tsx b/src/Augmentation/ui/InstalledAugmentationsAndSourceFiles.tsx
new file mode 100644
index 000000000..39bac22e6
--- /dev/null
+++ b/src/Augmentation/ui/InstalledAugmentationsAndSourceFiles.tsx
@@ -0,0 +1,56 @@
+/**
+ * React Component for displaying all of the player's installed Augmentations and
+ * Source-Files.
+ *
+ * It also contains 'configuration' buttons that allow you to change how the
+ * Augs/SF's are displayed
+ */
+import * as React from "react";
+
+import { Settings } from "../../Settings/Settings";
+import { OwnedAugmentationsOrderSetting } from "../../Settings/SettingEnums";
+
+type IProps = {
+
+}
+
+type IState = {
+ rerenderFlag: boolean;
+}
+
+export class InstalledAugmentationsAndSourceFiles extends React.Component{augs}
+ )
+}
diff --git a/src/Augmentation/ui/PurchasedAugmentations.tsx b/src/Augmentation/ui/PurchasedAugmentations.tsx
new file mode 100644
index 000000000..bd966dfe5
--- /dev/null
+++ b/src/Augmentation/ui/PurchasedAugmentations.tsx
@@ -0,0 +1,30 @@
+/**
+ * React component for displaying all of the player's purchased (but not installed)
+ * Augmentations on the Augmentations UI.
+ */
+import * as React from "react";
+
+import { Augmentations } from "../../Augmentation/Augmentations";
+import { AugmentationNames } from "../../Augmentation/data/AugmentationNames";
+import { Player } from "../../Player";
+
+import { AugmentationAccordion } from "../../ui/React/AugmentationAccordion";
+
+export function PurchasedAugmentations(): React.ReactElement {
+ const augs: React.ReactElement[] = [];
+ for (const ownedAug of Player.queuedAugmentations) {
+ const aug = Augmentations[ownedAug.name];
+ let level = null;
+ if (ownedAug.name === AugmentationNames.NeuroFluxGovernor) {
+ level = ownedAug.level;
+ }
+
+ augs.push(
+ {augs}
+ )
+}
diff --git a/src/Augmentation/ui/Root.tsx b/src/Augmentation/ui/Root.tsx
new file mode 100644
index 000000000..565267f31
--- /dev/null
+++ b/src/Augmentation/ui/Root.tsx
@@ -0,0 +1,72 @@
+/**
+ * Root React component for the Augmentations UI page that display all of your
+ * owned and purchased Augmentations and Source-Files.
+ */
+import * as React from "react";
+
+import { Augmentations } from "../../Augmentation/Augmentations";
+import { Player } from "../../Player";
+
+import { StdButton } from "../../ui/React/StdButton";
+
+type IProps = {
+ exportGameFn: () => void;
+ installAugmentationsFn: () => void;
+}
+
+type IState = {
+
+}
+
+export class AugmentationsRoot extends React.ComponentPurchased Augmentations
+
+
+
+
" +
- "Level 1: 16%
" +
- "Level 2: 24%
" +
- "Level 3: 28%");
- SourceFiles["SourceFile2"] = new SourceFile(2, "This Source-File allows you to form gangs in other BitNodes " +
- "once your karma decreases to a certain value. It also increases the player's " +
- "crime success rate, crime money, and charisma multipliers by:
" +
- "Level 1: 24%
" +
- "Level 2: 36%
" +
- "Level 3: 42%");
- SourceFiles["SourceFile3"] = new SourceFile(3,"This Source-File lets you create corporations on other BitNodes (although " +
- "some BitNodes will disable this mechanic). This Source-File also increases your charisma and company salary multipliers by:
" +
- "Level 1: 8%
" +
- "Level 2: 12%
" +
- "Level 3: 14%");
- SourceFiles["SourceFile4"] = new SourceFile(4, "This Source-File lets you access and use the Singularity Functions in every BitNode. Every " +
- "level of this Source-File opens up more of the Singularity Functions you can use.");
- SourceFiles["SourceFile5"] = new SourceFile(5, "This Source-File grants a special new stat called Intelligence. Intelligence " +
- "is unique because it is permanent and persistent (it never gets reset back to 1). However, " +
- "gaining Intelligence experience is much slower than other stats, and it is also hidden (you won't " +
- "know when you gain experience and how much). Higher Intelligence levels will boost your production " +
- "for many actions in the game. In addition, this Source-File will unlock the getBitNodeMultipliers() " +
- "Netscript function, and will raise all of your hacking-related multipliers by:
" +
- "Level 1: 8%
" +
- "Level 2: 12%
" +
- "Level 3: 14%");
- SourceFiles["SourceFile6"] = new SourceFile(6, "This Source-File allows you to access the NSA's Bladeburner Division in other " +
- "BitNodes. In addition, this Source-File will raise both the level and experience gain rate of all your combat stats by:
" +
- "Level 1: 8%
" +
- "Level 2: 12%
" +
- "Level 3: 14%");
- SourceFiles["SourceFile7"] = new SourceFile(7, "This Source-File allows you to access the Bladeburner Netscript API in other " +
- "BitNodes. In addition, this Source-File will increase all of your Bladeburner multipliers by:
" +
- "Level 1: 8%
" +
- "Level 2: 12%
" +
- "Level 3: 14%");
- SourceFiles["SourceFile8"] = new SourceFile(8, "This Source-File grants the following benefits:
" +
- "Level 1: Permanent access to WSE and TIX API
" +
- "Level 2: Ability to short stocks in other BitNodes
" +
- "Level 3: Ability to use limit/stop orders in other BitNodes
" +
- "This Source-File also increases your hacking growth multipliers by: " +
- "
Level 1: 12%
Level 2: 18%
Level 3: 21%");
- SourceFiles["SourceFile9"] = new SourceFile(9, "This Source-File grants the following benefits:
" +
- "Level 1: Permanently unlocks the Hacknet Server in other BitNodes
" +
- "Level 2: You start with 128GB of RAM on your home computer when entering a new BitNode
" +
- "Level 3: Grants a highly-upgraded Hacknet Server when entering a new BitNode
" +
- "(Note that the Level 3 effect of this Source-File only applies when entering a new BitNode, NOT " +
- "when installing Augmentations)");
- SourceFiles["SourceFile10"] = new SourceFile(10, "This Source-File unlocks Sleeve technology in other BitNodes. Each level of this " +
- "Source-File also grants you a Duplicate Sleeve");
- SourceFiles["SourceFile11"] = new SourceFile(11, "This Source-File makes it so that company favor increases BOTH the player's salary and reputation gain rate " +
- "at that company by 1% per favor (rather than just the reputation gain). This Source-File also " +
- " increases the player's company salary and reputation gain multipliers by:
" +
- "Level 1: 32%
" +
- "Level 2: 48%
" +
- "Level 3: 56%
");
- SourceFiles["SourceFile12"] = new SourceFile(12, "This Source-File increases all your multipliers by 1% per level. This effect is multiplicative with itself. " +
- "In other words, level N of this Source-File will result in a multiplier of 1.01^N (or 0.99^N for multipliers that decrease)");
-}
-
-// Takes in a PlayerOwnedSourceFile as the "srcFile" argument
-function applySourceFile(srcFile) {
- var srcFileKey = "SourceFile" + srcFile.n;
- var sourceFileObject = SourceFiles[srcFileKey];
- if (sourceFileObject == null) {
- console.log("ERROR: Invalid source file number: " + srcFile.n);
- return;
- }
-
- switch(srcFile.n) {
- case 1: // The Source Genesis
- var mult = 0;
- for (var i = 0; i < srcFile.lvl; ++i) {
- mult += (16 / (Math.pow(2, i)));
- }
- var incMult = 1 + (mult / 100);
- var decMult = 1 - (mult / 100);
- Player.hacking_chance_mult *= incMult;
- Player.hacking_speed_mult *= incMult;
- Player.hacking_money_mult *= incMult;
- Player.hacking_grow_mult *= incMult;
- Player.hacking_mult *= incMult;
- Player.strength_mult *= incMult;
- Player.defense_mult *= incMult;
- Player.dexterity_mult *= incMult;
- Player.agility_mult *= incMult;
- Player.charisma_mult *= incMult;
- Player.hacking_exp_mult *= incMult;
- Player.strength_exp_mult *= incMult;
- Player.defense_exp_mult *= incMult;
- Player.dexterity_exp_mult *= incMult;
- Player.agility_exp_mult *= incMult;
- Player.charisma_exp_mult *= incMult;
- Player.company_rep_mult *= incMult;
- Player.faction_rep_mult *= incMult;
- Player.crime_money_mult *= incMult;
- Player.crime_success_mult *= incMult;
- Player.hacknet_node_money_mult *= incMult;
- Player.hacknet_node_purchase_cost_mult *= decMult;
- Player.hacknet_node_ram_cost_mult *= decMult;
- Player.hacknet_node_core_cost_mult *= decMult;
- Player.hacknet_node_level_cost_mult *= decMult;
- Player.work_money_mult *= incMult;
- break;
- case 2: // Rise of the Underworld
- var mult = 0;
- for (var i = 0; i < srcFile.lvl; ++i) {
- mult += (24 / (Math.pow(2, i)));
- }
- var incMult = 1 + (mult / 100);
- Player.crime_money_mult *= incMult;
- Player.crime_success_mult *= incMult;
- Player.charisma_mult *= incMult;
- break;
- case 3: // Corporatocracy
- var mult = 0;
- for (var i = 0; i < srcFile.lvl; ++i) {
- mult += (8 / (Math.pow(2, i)));
- }
- var incMult = 1 + (mult / 100);
- Player.charisma_mult *= incMult;
- Player.work_money_mult *= incMult;
- break;
- case 4: // The Singularity
- // No effects, just gives access to Singularity functions
- break;
- case 5: // Artificial Intelligence
- var mult = 0;
- for (var i = 0; i < srcFile.lvl; ++i) {
- mult += (8 / (Math.pow(2, i)));
- }
- var incMult = 1 + (mult / 100);
- Player.hacking_chance_mult *= incMult;
- Player.hacking_speed_mult *= incMult;
- Player.hacking_money_mult *= incMult;
- Player.hacking_grow_mult *= incMult;
- Player.hacking_mult *= incMult;
- Player.hacking_exp_mult *= incMult;
- break;
- case 6: // Bladeburner
- var mult = 0;
- for (var i = 0; i < srcFile.lvl; ++i) {
- mult += (8 / (Math.pow(2, i)));
- }
- var incMult = 1 + (mult / 100);
- Player.strength_exp_mult *= incMult;
- Player.defense_exp_mult *= incMult;
- Player.dexterity_exp_mult *= incMult;
- Player.agility_exp_mult *= incMult;
- Player.strength_mult *= incMult;
- Player.defense_mult *= incMult;
- Player.dexterity_mult *= incMult;
- Player.agility_mult *= incMult;
- break;
- case 7: // Bladeburner 2079
- var mult = 0;
- for (var i = 0; i < srcFile.lvl; ++i) {
- mult += (8 / (Math.pow(2, i)));
- }
- var incMult = 1 + (mult / 100);
- Player.bladeburner_max_stamina_mult *= incMult;
- Player.bladeburner_stamina_gain_mult *= incMult;
- Player.bladeburner_analysis_mult *= incMult;
- Player.bladeburner_success_chance_mult *= incMult;
- break;
- case 8: // Ghost of Wall Street
- var mult = 0;
- for (var i = 0; i < srcFile.lvl; ++i) {
- mult += (12 / (Math.pow(2, i)));
- }
- var incMult = 1 + (mult / 100);
- Player.hacking_grow_mult *= incMult;
- break;
- case 9: // Hacktocracy
- // This has non-multiplier effects
- break;
- case 10: // Digital Carbon
- // No effects, just grants sleeves
- break;
- case 11: // The Big Crash
- var mult = 0;
- for (var i = 0; i < srcFile.lvl; ++i) {
- mult += (32 / (Math.pow(2, i)));
- }
- var incMult = 1 + (mult / 100);
- Player.work_money_mult *= incMult;
- Player.company_rep_mult *= incMult;
- break;
- case 12: // The Recursion
- var inc = Math.pow(1.01, srcFile.lvl);
- var dec = Math.pow(0.99, srcFile.lvl);
-
- Player.hacking_chance_mult *= inc;
- Player.hacking_speed_mult *= inc;
- Player.hacking_money_mult *= inc;
- Player.hacking_grow_mult *= inc;
- Player.hacking_mult *= inc;
-
- Player.strength_mult *= inc;
- Player.defense_mult *= inc;
- Player.dexterity_mult *= inc;
- Player.agility_mult *= inc;
- Player.charisma_mult *= inc;
-
- Player.hacking_exp_mult *= inc;
- Player.strength_exp_mult *= inc;
- Player.defense_exp_mult *= inc;
- Player.dexterity_exp_mult *= inc;
- Player.agility_exp_mult *= inc;
- Player.charisma_exp_mult *= inc;
-
- Player.company_rep_mult *= inc;
- Player.faction_rep_mult *= inc;
-
- Player.crime_money_mult *= inc;
- Player.crime_success_mult *= inc;
-
- Player.hacknet_node_money_mult *= inc;
- Player.hacknet_node_purchase_cost_mult *= dec;
- Player.hacknet_node_ram_cost_mult *= dec;
- Player.hacknet_node_core_cost_mult *= dec;
- Player.hacknet_node_level_cost_mult *= dec;
-
- Player.work_money_mult *= inc;
- break;
- default:
- console.log("ERROR: Invalid source file number: " + srcFile.n);
- break;
- }
-
- sourceFileObject.owned = true;
-}
-
-export {SourceFiles, applySourceFile, initSourceFiles};
diff --git a/src/SourceFile/SourceFile.ts b/src/SourceFile/SourceFile.ts
new file mode 100644
index 000000000..96290507a
--- /dev/null
+++ b/src/SourceFile/SourceFile.ts
@@ -0,0 +1,21 @@
+import { BitNodes } from "../BitNode/BitNode";
+
+export class SourceFile {
+ info: string;
+ lvl: number = 1;
+ n: number;
+ name: string;
+ owned: boolean = false;
+
+ constructor(number: number, info: string="") {
+ const bitnodeKey = "BitNode" + number;
+ const bitnode = BitNodes[bitnodeKey];
+ if (bitnode == null) {
+ throw new Error("Invalid Bit Node for this Source File");
+ }
+
+ this.n = number;
+ this.name = `Source-File ${number}: ${bitnode.name}`
+ this.info = info;
+ }
+}
diff --git a/src/SourceFile/SourceFiles.ts b/src/SourceFile/SourceFiles.ts
new file mode 100644
index 000000000..bc35dcba8
--- /dev/null
+++ b/src/SourceFile/SourceFiles.ts
@@ -0,0 +1,64 @@
+import { SourceFile } from "./SourceFile";
+import { IMap } from "../types";
+
+export const SourceFiles: IMap
" +
+ "Level 1: 16%
" +
+ "Level 2: 24%
" +
+ "Level 3: 28%");
+SourceFiles["SourceFile2"] = new SourceFile(2, "This Source-File allows you to form gangs in other BitNodes " +
+ "once your karma decreases to a certain value. It also increases the player's " +
+ "crime success rate, crime money, and charisma multipliers by:
" +
+ "Level 1: 24%
" +
+ "Level 2: 36%
" +
+ "Level 3: 42%");
+SourceFiles["SourceFile3"] = new SourceFile(3,"This Source-File lets you create corporations on other BitNodes (although " +
+ "some BitNodes will disable this mechanic). This Source-File also increases your charisma and company salary multipliers by:
" +
+ "Level 1: 8%
" +
+ "Level 2: 12%
" +
+ "Level 3: 14%");
+SourceFiles["SourceFile4"] = new SourceFile(4, "This Source-File lets you access and use the Singularity Functions in every BitNode. Every " +
+ "level of this Source-File opens up more of the Singularity Functions you can use.");
+SourceFiles["SourceFile5"] = new SourceFile(5, "This Source-File grants a special new stat called Intelligence. Intelligence " +
+ "is unique because it is permanent and persistent (it never gets reset back to 1). However, " +
+ "gaining Intelligence experience is much slower than other stats, and it is also hidden (you won't " +
+ "know when you gain experience and how much). Higher Intelligence levels will boost your production " +
+ "for many actions in the game. In addition, this Source-File will unlock the getBitNodeMultipliers() " +
+ "Netscript function, and will raise all of your hacking-related multipliers by:
" +
+ "Level 1: 8%
" +
+ "Level 2: 12%
" +
+ "Level 3: 14%");
+SourceFiles["SourceFile6"] = new SourceFile(6, "This Source-File allows you to access the NSA's Bladeburner Division in other " +
+ "BitNodes. In addition, this Source-File will raise both the level and experience gain rate of all your combat stats by:
" +
+ "Level 1: 8%
" +
+ "Level 2: 12%
" +
+ "Level 3: 14%");
+SourceFiles["SourceFile7"] = new SourceFile(7, "This Source-File allows you to access the Bladeburner Netscript API in other " +
+ "BitNodes. In addition, this Source-File will increase all of your Bladeburner multipliers by:
" +
+ "Level 1: 8%
" +
+ "Level 2: 12%
" +
+ "Level 3: 14%");
+SourceFiles["SourceFile8"] = new SourceFile(8, "This Source-File grants the following benefits:
" +
+ "Level 1: Permanent access to WSE and TIX API
" +
+ "Level 2: Ability to short stocks in other BitNodes
" +
+ "Level 3: Ability to use limit/stop orders in other BitNodes
" +
+ "This Source-File also increases your hacking growth multipliers by: " +
+ "
Level 1: 12%
Level 2: 18%
Level 3: 21%");
+SourceFiles["SourceFile9"] = new SourceFile(9, "This Source-File grants the following benefits:
" +
+ "Level 1: Permanently unlocks the Hacknet Server in other BitNodes
" +
+ "Level 2: You start with 128GB of RAM on your home computer when entering a new BitNode
" +
+ "Level 3: Grants a highly-upgraded Hacknet Server when entering a new BitNode
" +
+ "(Note that the Level 3 effect of this Source-File only applies when entering a new BitNode, NOT " +
+ "when installing Augmentations)");
+SourceFiles["SourceFile10"] = new SourceFile(10, "This Source-File unlocks Sleeve technology in other BitNodes. Each level of this " +
+ "Source-File also grants you a Duplicate Sleeve");
+SourceFiles["SourceFile11"] = new SourceFile(11, "This Source-File makes it so that company favor increases BOTH the player's salary and reputation gain rate " +
+ "at that company by 1% per favor (rather than just the reputation gain). This Source-File also " +
+ " increases the player's company salary and reputation gain multipliers by:
" +
+ "Level 1: 32%
" +
+ "Level 2: 48%
" +
+ "Level 3: 56%
");
+SourceFiles["SourceFile12"] = new SourceFile(12, "This Source-File increases all your multipliers by 1% per level. This effect is multiplicative with itself. " +
+ "In other words, level N of this Source-File will result in a multiplier of 1.01^N (or 0.99^N for multipliers that decrease)");
diff --git a/src/SourceFile/applySourceFile.ts b/src/SourceFile/applySourceFile.ts
new file mode 100644
index 000000000..e38b014ec
--- /dev/null
+++ b/src/SourceFile/applySourceFile.ts
@@ -0,0 +1,176 @@
+import { PlayerOwnedSourceFile } from "./PlayerOwnedSourceFile";
+import { SourceFiles } from "./SourceFiles";
+
+import { Player } from "../Player";
+
+export function applySourceFile(srcFile: PlayerOwnedSourceFile) {
+ const srcFileKey = "SourceFile" + srcFile.n;
+ const sourceFileObject = SourceFiles[srcFileKey];
+ if (sourceFileObject == null) {
+ console.error(`Invalid source file number: ${srcFile.n}`);
+ return;
+ }
+
+ switch (srcFile.n) {
+ case 1: // The Source Genesis
+ var mult = 0;
+ for (var i = 0; i < srcFile.lvl; ++i) {
+ mult += (16 / (Math.pow(2, i)));
+ }
+ var incMult = 1 + (mult / 100);
+ var decMult = 1 - (mult / 100);
+ Player.hacking_chance_mult *= incMult;
+ Player.hacking_speed_mult *= incMult;
+ Player.hacking_money_mult *= incMult;
+ Player.hacking_grow_mult *= incMult;
+ Player.hacking_mult *= incMult;
+ Player.strength_mult *= incMult;
+ Player.defense_mult *= incMult;
+ Player.dexterity_mult *= incMult;
+ Player.agility_mult *= incMult;
+ Player.charisma_mult *= incMult;
+ Player.hacking_exp_mult *= incMult;
+ Player.strength_exp_mult *= incMult;
+ Player.defense_exp_mult *= incMult;
+ Player.dexterity_exp_mult *= incMult;
+ Player.agility_exp_mult *= incMult;
+ Player.charisma_exp_mult *= incMult;
+ Player.company_rep_mult *= incMult;
+ Player.faction_rep_mult *= incMult;
+ Player.crime_money_mult *= incMult;
+ Player.crime_success_mult *= incMult;
+ Player.hacknet_node_money_mult *= incMult;
+ Player.hacknet_node_purchase_cost_mult *= decMult;
+ Player.hacknet_node_ram_cost_mult *= decMult;
+ Player.hacknet_node_core_cost_mult *= decMult;
+ Player.hacknet_node_level_cost_mult *= decMult;
+ Player.work_money_mult *= incMult;
+ break;
+ case 2: // Rise of the Underworld
+ var mult = 0;
+ for (var i = 0; i < srcFile.lvl; ++i) {
+ mult += (24 / (Math.pow(2, i)));
+ }
+ var incMult = 1 + (mult / 100);
+ Player.crime_money_mult *= incMult;
+ Player.crime_success_mult *= incMult;
+ Player.charisma_mult *= incMult;
+ break;
+ case 3: // Corporatocracy
+ var mult = 0;
+ for (var i = 0; i < srcFile.lvl; ++i) {
+ mult += (8 / (Math.pow(2, i)));
+ }
+ var incMult = 1 + (mult / 100);
+ Player.charisma_mult *= incMult;
+ Player.work_money_mult *= incMult;
+ break;
+ case 4: // The Singularity
+ // No effects, just gives access to Singularity functions
+ break;
+ case 5: // Artificial Intelligence
+ var mult = 0;
+ for (var i = 0; i < srcFile.lvl; ++i) {
+ mult += (8 / (Math.pow(2, i)));
+ }
+ var incMult = 1 + (mult / 100);
+ Player.hacking_chance_mult *= incMult;
+ Player.hacking_speed_mult *= incMult;
+ Player.hacking_money_mult *= incMult;
+ Player.hacking_grow_mult *= incMult;
+ Player.hacking_mult *= incMult;
+ Player.hacking_exp_mult *= incMult;
+ break;
+ case 6: // Bladeburner
+ var mult = 0;
+ for (var i = 0; i < srcFile.lvl; ++i) {
+ mult += (8 / (Math.pow(2, i)));
+ }
+ var incMult = 1 + (mult / 100);
+ Player.strength_exp_mult *= incMult;
+ Player.defense_exp_mult *= incMult;
+ Player.dexterity_exp_mult *= incMult;
+ Player.agility_exp_mult *= incMult;
+ Player.strength_mult *= incMult;
+ Player.defense_mult *= incMult;
+ Player.dexterity_mult *= incMult;
+ Player.agility_mult *= incMult;
+ break;
+ case 7: // Bladeburner 2079
+ var mult = 0;
+ for (var i = 0; i < srcFile.lvl; ++i) {
+ mult += (8 / (Math.pow(2, i)));
+ }
+ var incMult = 1 + (mult / 100);
+ Player.bladeburner_max_stamina_mult *= incMult;
+ Player.bladeburner_stamina_gain_mult *= incMult;
+ Player.bladeburner_analysis_mult *= incMult;
+ Player.bladeburner_success_chance_mult *= incMult;
+ break;
+ case 8: // Ghost of Wall Street
+ var mult = 0;
+ for (var i = 0; i < srcFile.lvl; ++i) {
+ mult += (12 / (Math.pow(2, i)));
+ }
+ var incMult = 1 + (mult / 100);
+ Player.hacking_grow_mult *= incMult;
+ break;
+ case 9: // Hacktocracy
+ // This has non-multiplier effects
+ break;
+ case 10: // Digital Carbon
+ // No effects, just grants sleeves
+ break;
+ case 11: // The Big Crash
+ var mult = 0;
+ for (var i = 0; i < srcFile.lvl; ++i) {
+ mult += (32 / (Math.pow(2, i)));
+ }
+ var incMult = 1 + (mult / 100);
+ Player.work_money_mult *= incMult;
+ Player.company_rep_mult *= incMult;
+ break;
+ case 12: // The Recursion
+ var inc = Math.pow(1.01, srcFile.lvl);
+ var dec = Math.pow(0.99, srcFile.lvl);
+
+ Player.hacking_chance_mult *= inc;
+ Player.hacking_speed_mult *= inc;
+ Player.hacking_money_mult *= inc;
+ Player.hacking_grow_mult *= inc;
+ Player.hacking_mult *= inc;
+
+ Player.strength_mult *= inc;
+ Player.defense_mult *= inc;
+ Player.dexterity_mult *= inc;
+ Player.agility_mult *= inc;
+ Player.charisma_mult *= inc;
+
+ Player.hacking_exp_mult *= inc;
+ Player.strength_exp_mult *= inc;
+ Player.defense_exp_mult *= inc;
+ Player.dexterity_exp_mult *= inc;
+ Player.agility_exp_mult *= inc;
+ Player.charisma_exp_mult *= inc;
+
+ Player.company_rep_mult *= inc;
+ Player.faction_rep_mult *= inc;
+
+ Player.crime_money_mult *= inc;
+ Player.crime_success_mult *= inc;
+
+ Player.hacknet_node_money_mult *= inc;
+ Player.hacknet_node_purchase_cost_mult *= dec;
+ Player.hacknet_node_ram_cost_mult *= dec;
+ Player.hacknet_node_core_cost_mult *= dec;
+ Player.hacknet_node_level_cost_mult *= dec;
+
+ Player.work_money_mult *= inc;
+ break;
+ default:
+ console.log("ERROR: Invalid source file number: " + srcFile.n);
+ break;
+ }
+
+ sourceFileObject.owned = true;
+}
diff --git a/src/engine.jsx b/src/engine.jsx
index e86bbcdfb..488c21eb6 100644
--- a/src/engine.jsx
+++ b/src/engine.jsx
@@ -13,7 +13,6 @@ import {
PlayerOwnedAugmentation
} from "./Augmentation/AugmentationHelpers";
import { AugmentationNames } from "./Augmentation/data/AugmentationNames";
-
import {
BitNodes,
initBitNodes,
@@ -54,14 +53,14 @@ import {
updateOnlineScriptTimes,
} from "./NetscriptWorker";
import { Player } from "./Player";
-import { prestigeAugmentation, prestigeSourceFile } from "./Prestige";
+import { prestigeAugmentation } from "./Prestige";
import { Programs } from "./Programs/Programs";
import {
displayCreateProgramContent,
getNumAvailableCreateProgram,
initCreateProgramButtons
} from "./Programs/ProgramHelpers";
-import { redPillFlag, hackWorldDaemon } from "./RedPill";
+import { redPillFlag } from "./RedPill";
import { saveObject, loadGame } from "./SaveObject";
import {
getCurrentEditor,
@@ -69,10 +68,7 @@ import {
updateScriptEditorContent
} from "./Script/ScriptHelpers";
import { AllServers, initForeignServers } from "./Server/AllServers";
-
-import { Server } from "./Server/Server";
import { Settings } from "./Settings/Settings";
-import { initSourceFiles, SourceFiles } from "./SourceFile";
import { updateSourceFileFlags } from "./SourceFile/SourceFileFlags";
import {
SpecialServerIps,
@@ -87,7 +83,6 @@ import {
displayStockMarketContent
} from "./StockMarket/StockMarket";
import { Terminal, postNetburnerText } from "./Terminal";
-
import { Sleeve } from "./PersonObjects/Sleeve/Sleeve";
import {
clearSleevesPage,
@@ -1045,7 +1040,6 @@ const Engine = {
if (loadGame(saveString)) {
initBitNodes();
initBitNodeMultipliers(Player);
- initSourceFiles();
Engine.setDisplayElements(); // Sets variables for important DOM elements
Engine.init(); // Initialize buttons, work, etc.
initAugmentations(); // Also calls Player.reapplyAllAugmentations()
@@ -1168,7 +1162,6 @@ const Engine = {
console.log("Initializing new game");
initBitNodes();
initBitNodeMultipliers(Player);
- initSourceFiles();
initSpecialServerIps();
Engine.setDisplayElements(); // Sets variables for important DOM elements
Engine.start(); // Run main game loop and Scripts loop
diff --git a/src/engineStyle.js b/src/engineStyle.js
index df9dd7250..c297b37cc 100644
--- a/src/engineStyle.js
+++ b/src/engineStyle.js
@@ -11,6 +11,7 @@ import "../css/scripteditor.scss";
import "../css/codemirror-overrides.scss";
import "../css/hacknetnodes.scss";
import "../css/menupages.scss";
+import "../css/augmentations.scss";
import "../css/redpill.scss";
import "../css/stockmarket.scss";
import "../css/workinprogress.scss";
diff --git a/src/ui/React/AugmentationAccordion.tsx b/src/ui/React/AugmentationAccordion.tsx
new file mode 100644
index 000000000..430a9800c
--- /dev/null
+++ b/src/ui/React/AugmentationAccordion.tsx
@@ -0,0 +1,33 @@
+/**
+ * React Component for displaying a single Augmentation as an accordion.
+ *
+ * The header of the accordion contains the Augmentation's name (and level, if
+ * applicable), and the accordion's panel contains the Augmentation's level.
+ */
+import * as React from "react";
+
+import { Accordion } from "./Accordion";
+
+import { Augmentation } from "../../Augmentation/Augmentation";
+import { AugmentationNames } from "../../Augmentation/data/AugmentationNames";
+
+type IProps = {
+ aug: Augmentation,
+ level?: number | string | null,
+}
+
+export function AugmentationAccordion(props: IProps): React.ReactElement {
+ let displayName = props.aug.name;
+ if (props.level != null) {
+ if (props.aug.name === AugmentationNames.NeuroFluxGovernor) {
+ displayName += (` - Level ${props.level}`)
+ }
+ }
+
+ return (
+
{props.aug.info}
} + /> + ) +} diff --git a/src/ui/React/Popup.tsx b/src/ui/React/Popup.tsx index 2d84ad684..c296809bb 100644 --- a/src/ui/React/Popup.tsx +++ b/src/ui/React/Popup.tsx @@ -13,12 +13,10 @@ interface IProps { props: object; } -export class Popup extends React.ComponentTotal Multipliers:
+ ++ {'Hacking Chance multiplier: ' + numeralWrapper.formatPercentage(Player.hacking_chance_mult)} ++
+ {'Hacking Speed multiplier: ' + numeralWrapper.formatPercentage(Player.hacking_speed_mult)} ++
+ {'Hacking Money multiplier: ' + numeralWrapper.formatPercentage(Player.hacking_money_mult)} ++
+ {'Hacking Growth multiplier: ' + numeralWrapper.formatPercentage(Player.hacking_grow_mult)} +
+ {'Hacking Level multiplier: ' + numeralWrapper.formatPercentage(Player.hacking_mult)} ++
+ {'Hacking Experience multiplier: ' + numeralWrapper.formatPercentage(Player.hacking_exp_mult)} ++
+ {'Strength Level multiplier: ' + numeralWrapper.formatPercentage(Player.strength_mult)} ++
+ {'Strength Experience multiplier: ' + numeralWrapper.formatPercentage(Player.strength_exp_mult)} ++
+ {'Defense Level multiplier: ' + numeralWrapper.formatPercentage(Player.defense_mult)} ++
+ {'Defense Experience multiplier: ' + numeralWrapper.formatPercentage(Player.defense_exp_mult)} +
+ {'Dexterity Level multiplier: ' + numeralWrapper.formatPercentage(Player.dexterity_mult)} ++
+ {'Dexterity Experience multiplier: ' + numeralWrapper.formatPercentage(Player.dexterity_exp_mult)} +
+ {'Agility Level multiplier: ' + numeralWrapper.formatPercentage(Player.agility_mult)} ++
+ {'Agility Experience multiplier: ' + numeralWrapper.formatPercentage(Player.agility_exp_mult)} +
+ {'Charisma Level multiplier: ' + numeralWrapper.formatPercentage(Player.charisma_mult)} ++
+ {'Charisma Experience multiplier: ' + numeralWrapper.formatPercentage(Player.charisma_exp_mult)} +
+ {'Hacknet Node production multiplier: ' + numeralWrapper.formatPercentage(Player.hacknet_node_money_mult)} ++
+ {'Hacknet Node purchase cost multiplier: ' + numeralWrapper.formatPercentage(Player.hacknet_node_purchase_cost_mult)} ++
+ {'Hacknet Node RAM upgrade cost multiplier: ' + numeralWrapper.formatPercentage(Player.hacknet_node_ram_cost_mult)} ++
+ {'Hacknet Node Core purchase cost multiplier: ' + numeralWrapper.formatPercentage(Player.hacknet_node_core_cost_mult)} ++
+ {'Hacknet Node level upgrade cost multiplier: ' + numeralWrapper.formatPercentage(Player.hacknet_node_level_cost_mult)} +
+ {'Company reputation gain multiplier: ' + numeralWrapper.formatPercentage(Player.company_rep_mult)} ++
+ {'Faction reputation gain multiplier: ' + numeralWrapper.formatPercentage(Player.faction_rep_mult)} ++
+ {'Salary multiplier: ' + numeralWrapper.formatPercentage(Player.work_money_mult)} +
+ {'Crime success multiplier: ' + numeralWrapper.formatPercentage(Player.crime_success_mult)} ++
+ {'Crime money multiplier: ' + numeralWrapper.formatPercentage(Player.crime_money_mult)} ++ > + ) +} diff --git a/src/Augmentation/ui/PurchasedAugmentations.tsx b/src/Augmentation/ui/PurchasedAugmentations.tsx index bd966dfe5..3bc54d837 100644 --- a/src/Augmentation/ui/PurchasedAugmentations.tsx +++ b/src/Augmentation/ui/PurchasedAugmentations.tsx @@ -20,7 +20,9 @@ export function PurchasedAugmentations(): React.ReactElement { } augs.push( -
Below is a list of all Augmentations you have purchased but not
@@ -34,14 +36,14 @@ export class AugmentationsRoot extends React.Component
WARNING: Installing your Augmentations resets most of your progress,
including:
-
- Stats/Skill levels and Experience
- Money
- Scripts on every computer but your home computer
- Purchased servers
- Hacknet Nodes
- Faction/Company reputation
-- Stocks
+- Stocks
Installing Augmentations lets you start over with the perks and
benefits granted by all of the Augmentations you have ever
@@ -62,10 +64,19 @@ export class AugmentationsRoot extends React.Component
+ {
+ `List of all Augmentations ${Player.sourceFiles.length > 0 ? "and Source Files " : ""} ` +
+ `that have been installed. You have gained the effects of these.`
+ }
+
+
+ Installed Augmentations
+
+
{props.aug.info}
} + headerContent={<>{displayName}>} + panelContent={} /> ) } diff --git a/src/ui/React/SourceFileAccordion.tsx b/src/ui/React/SourceFileAccordion.tsx new file mode 100644 index 000000000..2f5172e36 --- /dev/null +++ b/src/ui/React/SourceFileAccordion.tsx @@ -0,0 +1,35 @@ +/** + * React Component for displaying a single Source-File as an accordion. + * + * The header of the accordion contains the Source-Files's name and level, + * and the accordion's panel contains the Source-File's description. + */ +import * as React from "react"; + +import { Accordion } from "./Accordion"; + +import { SourceFile } from "../../SourceFile/SourceFile"; + +type IProps = { + level: number, + sf: SourceFile, +} + +export function SourceFileAccordion(props: IProps): React.ReactElement { + const maxLevel = props.sf.n === 3 ? "∞" : "3"; + + return ( ++ This page displays a list of all of your scripts that are currently + running across every machine. It also provides information about each + script's production. The scripts are categorized by the hostname of + the servers on which they are running. +
+ + > + ) + } +} diff --git a/src/ui/ActiveScripts/WorkerScriptAccordion.tsx b/src/ui/ActiveScripts/WorkerScriptAccordion.tsx new file mode 100644 index 000000000..117c2b045 --- /dev/null +++ b/src/ui/ActiveScripts/WorkerScriptAccordion.tsx @@ -0,0 +1,40 @@ +/** + * React Component for displaying a single WorkerScript's info as an + * Accordion element + */ +import * as React from "react"; + +import { Accordion } from "../React/Accordion"; + +import { WorkerScript } from "../../Netscript/WorkerScript"; + +import { arrayToString } from "../../../utils/helpers/arrayToString"; + +type IProps = { + workerScript: WorkerScript; +} + +export function WorkerScriptAccordion(props: IProps): React.ReactElement { + + + return ( ++ Threads: {props.workerScript.scriptRef.threads} +
++ Args: {arrayToString(props.workerScript.args)} +
+ > + } + /> + ) +} diff --git a/src/ui/React/Accordion.tsx b/src/ui/React/Accordion.tsx index 5833f29f7..948039076 100644 --- a/src/ui/React/Accordion.tsx +++ b/src/ui/React/Accordion.tsx @@ -4,7 +4,9 @@ import * as React from "react"; type IProps = { + headerClass?: string; // Override default class headerContent: React.ReactElement; + panelClass?: string; // Override default class panelContent: React.ReactElement; panelInitiallyOpened?: boolean; } @@ -44,12 +46,21 @@ export class Accordion extends React.Component