diff --git a/Quotes.txt b/Quotes.txt
new file mode 100644
index 000000000..e908c0697
--- /dev/null
+++ b/Quotes.txt
@@ -0,0 +1,45 @@
+Collection of Quotes
+
+The past is relevant only as data
+
+Pull on the new flesh like borrowed gloves and burn your fingers once again.
+
+A weapon is a tool. A tool for killing and destroying. And there will be times
+when you must kill and destroy. Then you will choose and equip yourself with the tools
+that you need. But remember the weakness of weapons. They are an extension --
+You are the killer and destroyer. You are whole, with or without them.
+
+For all that we have done, as a civilization, as individuals, the universe is
+not stable, and nor is any single thing within it. Stars consume themselves,
+the universe itself rushes apart, and we ourselves are composed of matter in
+constant flux. Colonies of cells in temporary alliance, replicating and
+decaying and housed within, an incandescent cloud of electrical impulse and
+precariously stacked carbon code memory. This is reality, this is self knowledge,
+and the perception of it will, of course, make you dizzy.
+
+You are still young and stupid. Human life has no value. Haven't you learned
+that yet, Takeshi, with all you've seen? It has no value, intrinsic to itself.
+Machines cost money to build. Raw materials cost money to extract. But people?"
+She made a tiny spitting sound. "You can always get some more people. they
+reproduce like cancer cells, whether you want them or not. They are abundant,
+Takeshi. Why should they be valuable? Do you know that it costs us less to
+recruit and use up a real snuff whore than it does to set up and run the virtual
+equivalent format. Real human flesh is cheaper than a machine. It's the axiomatic
+truth of our times.
+
+Peace is an illusion, no matter how tranquil the world seems, peace doesn't last long.
+Peace is a struggle against our very nature. A skin we sketch over the bone, muscle,
+and sinew of our own innate savagery.
+
+The human eye is a wonderful device. With a little effort, it can fail to see even
+the most glaring injustice.
+
+Humanity has spread to the stars. We set out like ancient seafarers to explore
+the limitless ocean of space. But no matter how far we venture into the unknown,
+the worst monsters are those we bring with us.
+
+What we believe shapes who we are. Belief can bring us salvation or destruction.
+But when you believe a lie for too long, the truth doesn't set you free. It tears
+you apart.
+
+We aren't meant to live forever. It corrupts even the best of us.
diff --git a/src/BitNode/BitNode.js b/src/BitNode/BitNode.js
index 6985a10f8..489b9b52b 100644
--- a/src/BitNode/BitNode.js
+++ b/src/BitNode/BitNode.js
@@ -157,7 +157,20 @@ function initBitNodes() {
"This Source-File also increases your hacking growth multipliers by: " +
"
Level 1: 12%
Level 2: 18%
Level 3: 21%");
BitNodes["BitNode9"] = new BitNode(9, "Do Androids Dream?", "COMING SOON");
- BitNodes["BitNode10"] = new BitNode(10, "MegaCorp", "COMING SOON"); //Not sure yet
+ BitNodes["BitNode10"] = new BitNode(10, "Digital Carbon", "Your body is not who you are",
+ "In 2084, VitaLife unveiled to the world the Persona Core, an Augmentation that allowed people " +
+ "to digitize their consciousness. Their consciousness could then be transferred into Synthoids " +
+ "or other bodies by trasmitting the digitized data. Human bodies became nothing more than 'sleeves' for the " +
+ "human consciousness. Mankind had finally achieved immortality - at least for those that could afford it.
" +
+ "This BitNode unlocks Sleeve technology. Sleeve technology allows you to:
" +
+ "1. Re-sleeve: Purchase and transfer your consciousness into a new body
" +
+ "2. Duplicate Sleeves: Duplicate your consciousness into Synthoids, allowing you to perform different tasks synchronously
" +
+ "In this BitNode:
" +
+ "Your stats are significantly decreased.
" +
+ "All methods of gaining money are half as profitable (except Stock Market)
" +
+ "Augmentations are 5x as expensive and require twice as much reputation
" +
+ "Destroying this BitNode will give you Source-File 10, or if you already have this Source-File it will " +
+ "upgrade its level up to a maximum of 3. Each level of this Source-File grants you a Duplicate Sleeve.");
BitNodes["BitNode11"] = new BitNode(11, "The Big Crash", "Okay. Sell it all.",
"The 2050s was defined by the massive amounts of violent civil unrest and anarchic rebellion that rose all around the world. It was this period " +
"of disorder that eventually lead to the governmental reformation of many global superpowers, most notably " +
@@ -306,6 +319,23 @@ function initBitNodeMultipliers() {
BitNodeMultipliers.CorporationValuation = 0;
BitNodeMultipliers.CodingContractMoney = 0;
break;
+ case 10: // Digital Carbon
+ BitNodeMultipliers.HackingLevelMultiplier = 0.2;
+ BitNodeMultipliers.StrengthLevelMultiplier = 0.4;
+ BitNodeMultipliers.DefenseLevelMultiplier = 0.4;
+ BitNodeMultipliers.DexterityLevelMultiplier = 0.4;
+ BitNodeMultipliers.AgilityLevelMultiplier = 0.4;
+ BitNodeMultipliers.CharismaLevelMultiplier = 0.4;
+ BitNodeMultipliers.CompanyWorkMoney = 0.5;
+ BitNodeMultipliers.CrimeMoney = 0.5;
+ BitNodeMultipliers.HacknetNodeMoney = 0.5;
+ BitNodeMultipliers.ManualHackMoney = 0.5;
+ BitNodeMultipliers.ScriptHackMoney = 0.5;
+ BitNodeMultipliers.CodingContractMoney = 0.5;
+ BitNodeMultipliers.InfiltrationMoney = 0.5;
+ BitNodeMultipliers.CorporationValuation = 0.5;
+ BitNodeMultipliers.AugmentationMoneyCost = 5;
+ BitNodeMultipliers.AugmentationRepCost = 2;
case 11: //The Big Crash
BitNodeMultipliers.ServerMaxMoney = 0.1;
BitNodeMultipliers.ServerStartingMoney = 0.1;
diff --git a/src/BitNode/BitNodeMultipliers.ts b/src/BitNode/BitNodeMultipliers.ts
index 89951f147..b1f7f7c07 100644
--- a/src/BitNode/BitNodeMultipliers.ts
+++ b/src/BitNode/BitNodeMultipliers.ts
@@ -4,6 +4,11 @@
* player toward the intended strategy. Unless they really want to play the long, slow game of waiting...
*/
interface IBitNodeMultipliers {
+ /**
+ * Influences how quickly the player's agility level (not exp) scales
+ */
+ AgilityLevelMultiplier: number;
+
/**
* Influences the base cost to purchase an augmentation.
*/
@@ -24,6 +29,11 @@ interface IBitNodeMultipliers {
*/
BladeburnerSkillCost: number;
+ /**
+ * Influences how quickly the player's charisma level (not exp) scales
+ */
+ CharismaLevelMultiplier: number;
+
/**
* Influences the experience gained for each ability when a player completes a class.
*/
@@ -59,6 +69,16 @@ interface IBitNodeMultipliers {
*/
CrimeMoney: number;
+ /**
+ * Influences how quickly the player's defense level (not exp) scales
+ */
+ DefenseLevelMultiplier: number;
+
+ /**
+ * Influences how quickly the player's dexterity level (not exp) scales
+ */
+ DexterityLevelMultiplier: number;
+
/**
* Influences how much rep the player gains in each faction simply by being a member.
*/
@@ -139,6 +159,11 @@ interface IBitNodeMultipliers {
* Influences the weaken amount per invocation against a server.
*/
ServerWeakenRate: number;
+
+ /**
+ * Influences how quickly the player's strength level (not exp) scales
+ */
+ StrengthLevelMultiplier: number;
}
/**
@@ -147,6 +172,11 @@ interface IBitNodeMultipliers {
// tslint:disable-next-line:variable-name
export const BitNodeMultipliers: IBitNodeMultipliers = {
HackingLevelMultiplier: 1,
+ StrengthLevelMultiplier: 1,
+ DefenseLevelMultiplier: 1,
+ DexterityLevelMultiplier: 1,
+ AgilityLevelMultiplier: 1,
+ CharismaLevelMultiplier: 1,
ServerGrowthRate: 1,
ServerMaxMoney: 1,
diff --git a/src/Constants.ts b/src/Constants.ts
index 3fb272428..016570f64 100644
--- a/src/Constants.ts
+++ b/src/Constants.ts
@@ -276,6 +276,9 @@ export let CONSTANTS: IMap = {
CodingContractBaseCompanyRepGain: 4000,
CodingContractBaseMoneyGain: 50e6,
+ // BitNode/Source-File related stuff
+ TotalNumBitNodes: 24,
+
/* Tutorial related things */
TutorialNetworkingText: "Servers are a central part of the game. You start with a single personal server (your home computer) " +
"and you can purchase additional servers as you progress through the game. Connecting to other servers " +
diff --git a/src/PersonObjects/IPlayer.ts b/src/PersonObjects/IPlayer.ts
index 1a2fd506a..11c45ff98 100644
--- a/src/PersonObjects/IPlayer.ts
+++ b/src/PersonObjects/IPlayer.ts
@@ -9,6 +9,7 @@ import { Sleeve } from "./Sleeve/Sleeve";
import { IMap } from "../types";
import { IPlayerOwnedAugmentation } from "../Augmentation/PlayerOwnedAugmentation";
+import { IPlayerOwnedSourceFile } from "../SourceFile/PlayerOwnedSourceFile";
export interface IPlayer {
augmentations: IPlayerOwnedAugmentation[];
@@ -19,6 +20,7 @@ export interface IPlayer {
queuedAugmentations: IPlayerOwnedAugmentation[];
resleeves: Resleeve[];
sleeves: Sleeve[];
+ sourceFiles: IPlayerOwnedSourceFile[];
hacking_skill: number;
strength: number;
diff --git a/src/PersonObjects/Resleeving/ResleevingUI.ts b/src/PersonObjects/Resleeving/ResleevingUI.ts
index 7e6494f44..07a3e41c0 100644
--- a/src/PersonObjects/Resleeving/ResleevingUI.ts
+++ b/src/PersonObjects/Resleeving/ResleevingUI.ts
@@ -194,5 +194,5 @@ function updateAugDescription(elems: IResleeveUIElems) {
return;
}
- elems.augDescription.innerHTML = aug!.info;
+ elems.augDescription!.innerHTML = aug!.info;
}
diff --git a/src/PersonObjects/Sleeve/SleeveUI.ts b/src/PersonObjects/Sleeve/SleeveUI.ts
index 456d43df1..4b0b4a1c4 100644
--- a/src/PersonObjects/Sleeve/SleeveUI.ts
+++ b/src/PersonObjects/Sleeve/SleeveUI.ts
@@ -76,7 +76,7 @@ export function createSleevesPage(p: IPlayer) {
UIElems.info = createElement("p", {
display: "inline-block",
- innerText: "Sleeves are MK-V Synthoids (synthetic androids) into which your " +
+ innerText: "Duplicate Sleeves are MK-V Synthoids (synthetic androids) into which your " +
"consciousness has copied. In other words, these Synthoids contain " +
"a perfect duplicate of your mind.
" +
"Sleeves can be used to perform different tasks synchronously.",
diff --git a/src/Player.js b/src/Player.js
index 243952628..688aafa8a 100644
--- a/src/Player.js
+++ b/src/Player.js
@@ -22,10 +22,12 @@ import { displayFactionContent } from "./Faction/FactionHelpers";
import {Gang, resetGangs} from "./Gang";
import {Locations} from "./Locations";
import {hasBn11SF, hasWallStreetSF,hasAISF} from "./NetscriptFunctions";
+import { Sleeve } from "./PersonObjects/Sleeve/Sleeve";
import {AllServers, Server, AddToAllServers} from "./Server";
import {Settings} from "./Settings";
import {SpecialServerIps, SpecialServerNames} from "./SpecialServerIps";
import {SourceFiles, applySourceFile} from "./SourceFile";
+import { SourceFileFlags } from "./SourceFile/SourceFileFlags";
import Decimal from "decimal.js";
import {numeralWrapper} from "./ui/numeralFormat";
import {dialogBoxCreate} from "../utils/DialogBox";
@@ -274,6 +276,8 @@ PlayerObject.prototype.prestigeAugmentation = function() {
this.queuedAugmentations = [];
+ this.resleeves = [];
+
this.isWorking = false;
this.currentWorkFactionName = "";
this.currentWorkFactionDescription = "";
@@ -355,6 +359,16 @@ PlayerObject.prototype.prestigeSourceFile = function() {
this.queuedAugmentations = [];
this.augmentations = [];
+ this.resleeves = [];
+
+ // Duplicate sleeves are reset to level 1 every Bit Node (but the number of sleeves you have persists)
+ if (this.sleeves.length < SourceFileFlags[10]) {
+ this.sleeves.length = SourceFileFlags[10];
+ }
+ for (let i = 0; i < this.sleeves.length; ++i) {
+ this.sleeves[i] = new Sleeve();
+ }
+
this.isWorking = false;
this.currentWorkFactionName = "";
this.currentWorkFactionDescription = "";
@@ -443,11 +457,11 @@ PlayerObject.prototype.calculateSkill = function(exp, mult=1) {
PlayerObject.prototype.updateSkillLevels = function() {
this.hacking_skill = Math.max(1, Math.floor(this.calculateSkill(this.hacking_exp, this.hacking_mult * BitNodeMultipliers.HackingLevelMultiplier)));
- this.strength = this.calculateSkill(this.strength_exp, this.strength_mult);
- this.defense = this.calculateSkill(this.defense_exp, this.defense_mult);
- this.dexterity = this.calculateSkill(this.dexterity_exp, this.dexterity_mult);
- this.agility = this.calculateSkill(this.agility_exp, this.agility_mult);
- this.charisma = this.calculateSkill(this.charisma_exp, this.charisma_mult);
+ this.strength = Math.max(1, Math.floor(this.calculateSkill(this.strength_exp, this.strength_mult * BitNodeMultipliers.StrengthLevelMultiplier)));
+ this.defense = Math.max(1, Math.floor(this.calculateSkill(this.defense_exp, this.defense_mult * BitNodeMultipliers.DefenseLevelMultiplier)));
+ this.dexterity = Math.max(1, Math.floor(this.calculateSkill(this.dexterity_exp, this.dexterity_mult * BitNodeMultipliers.DexterityLevelMultiplier)));
+ this.agility = Math.max(1, Math.floor(this.calculateSkill(this.agility_exp, this.agility_mult * BitNodeMultipliers.AgilityLevelMultiplier)));
+ this.charisma = Math.max(1, Math.floor(this.calculateSkill(this.charisma_exp, this.charisma_mult * BitNodeMultipliers.CharismaLevelMultiplier)));
if (this.intelligence > 0) {
this.intelligence = Math.floor(this.calculateSkill(this.intelligence_exp));
diff --git a/src/Prestige.js b/src/Prestige.js
index d58c99ab6..137f0c8c4 100755
--- a/src/Prestige.js
+++ b/src/Prestige.js
@@ -26,6 +26,7 @@ import {AllServers, AddToAllServers,
initForeignServers, Server,
prestigeAllServers,
prestigeHomeComputer} from "./Server";
+import { updateSourceFileFlags } from "./SourceFile/SourceFileFlags";
import {SpecialServerIps, SpecialServerIpsMap,
prestigeSpecialServerIps,
SpecialServerNames} from "./SpecialServerIps";
@@ -171,6 +172,7 @@ function prestigeAugmentation() {
//Prestige by destroying Bit Node and gaining a Source File
function prestigeSourceFile() {
initBitNodeMultipliers();
+ updateSourceFileFlags(Player);
Player.prestigeSourceFile();
prestigeWorkerScripts(); //Delete all Worker Scripts objects
diff --git a/src/RedPill.js b/src/RedPill.js
index b7f572ee5..415048d06 100644
--- a/src/RedPill.js
+++ b/src/RedPill.js
@@ -3,8 +3,8 @@ import { Engine } from "./engine";
import { Player } from "./Player";
import { prestigeSourceFile } from "./Prestige";
import { SourceFiles,
- SourceFile,
- PlayerOwnedSourceFile } from "./SourceFile";
+ SourceFile } from "./SourceFile";
+import { PlayerOwnedSourceFile } from "./SourceFile/PlayerOwnedSourceFile";
import { Terminal } from "./Terminal";
import {clearEventListeners} from "../utils/uiHelpers/clearEventListeners";
diff --git a/src/SourceFile.js b/src/SourceFile.js
index f56c52a09..ee5fd4166 100644
--- a/src/SourceFile.js
+++ b/src/SourceFile.js
@@ -74,11 +74,6 @@ function initSourceFiles() {
"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)");
}
-function PlayerOwnedSourceFile(number, level) {
- this.n = number;
- this.lvl = level;
-}
-
//Takes in a PlayerOwnedSourceFile as the "srcFile" argument
function applySourceFile(srcFile) {
var srcFileKey = "SourceFile" + srcFile.n;
@@ -246,4 +241,4 @@ function applySourceFile(srcFile) {
sourceFileObject.owned = true;
}
-export {SourceFiles, PlayerOwnedSourceFile, applySourceFile, initSourceFiles};
+export {SourceFiles, applySourceFile, initSourceFiles};
diff --git a/src/SourceFile/PlayerOwnedSourceFile.ts b/src/SourceFile/PlayerOwnedSourceFile.ts
new file mode 100644
index 000000000..2f641136d
--- /dev/null
+++ b/src/SourceFile/PlayerOwnedSourceFile.ts
@@ -0,0 +1,17 @@
+export class PlayerOwnedSourceFile {
+ // Source-File level
+ lvl: number = 1;
+
+ // Source-File number
+ n: number = 1;
+
+ constructor(n: number, level: number) {
+ this.n = n;
+ this.lvl = level;
+ }
+}
+
+export interface IPlayerOwnedSourceFile {
+ lvl: number;
+ n: number;
+}
diff --git a/src/SourceFile/SourceFileFlags.ts b/src/SourceFile/SourceFileFlags.ts
new file mode 100644
index 000000000..3b9a6a796
--- /dev/null
+++ b/src/SourceFile/SourceFileFlags.ts
@@ -0,0 +1,18 @@
+// Contains an array containing information about the player's source files
+// Array[n] returns what level the player has of Source-File N.
+
+import { CONSTANTS } from "../Constants";
+import { IPlayer } from "../PersonObjects/IPlayer";
+
+export const SourceFileFlags: number[] = Array(CONSTANTS.TotalNumBitNodes + 1); // Skip 0
+
+export function updateSourceFileFlags(p: IPlayer) {
+ for (let i = 0; i < SourceFileFlags.length; ++i) {
+ SourceFileFlags[i] = 0;
+ }
+
+ for (let i = 0; i < p.sourceFiles.length; ++i) {
+ const sf = p.sourceFiles[i];
+ SourceFileFlags[sf.n] = sf.lvl;
+ }
+}
diff --git a/src/engine.js b/src/engine.js
index d33fc3f7d..0310897c4 100644
--- a/src/engine.js
+++ b/src/engine.js
@@ -69,8 +69,9 @@ import {loadAllRunningScripts, scriptEditorInit,
import {AllServers, Server, initForeignServers} from "./Server";
import {Settings} from "./Settings";
import {setSettingsLabels} from "./ui/setSettingsLabels";
-import {initSourceFiles, SourceFiles,
- PlayerOwnedSourceFile} from "./SourceFile";
+import { initSourceFiles, SourceFiles } from "./SourceFile";
+import { updateSourceFileFlags } from "./SourceFile/SourceFileFlags";
+
import {SpecialServerIps, initSpecialServerIps} from "./SpecialServerIps";
import {StockMarket, StockSymbols,
SymbolToStockMap, initStockSymbols,
@@ -1239,8 +1240,7 @@ const Engine = {
}
initLiterature();
initSingularitySFFlags();
-
- console.log(Player.intelligence_exp);
+ updateSourceFileFlags(Player);
//Calculate the number of cycles have elapsed while offline
Engine._lastUpdate = new Date().getTime();