diff --git a/src/Augmentations.js b/src/Augmentations.js index f0f9d7d56..2467924f5 100644 --- a/src/Augmentations.js +++ b/src/Augmentations.js @@ -116,18 +116,32 @@ AugmentationNames = { Neurotrainer2: "Neurotrainer II", Neurotrainer3: "Neurotrainer III", Hypersight: "HyperSight Corneal Implant", + LuminCloaking1: "LuminCloaking-V1 Skin Implant", + LuminCloaking2: "LuminCloaking-V2 Skin Implant", + HemoRecirculator: "HemoRecirculator", + SmartSonar: "SmartSonar Implant" } -//TODO Something that decreases RAM usage of scripts initAugmentations = function() { //Combat stat augmentations + var HemoRecirculator = new Augmentation(AugmentationNames.HemoRecirculator); + HemoRecirculator.setInfo("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 10%.") + HemoRecirculator.setRequirements(5000, 10000000); + HemoRecirculator.addToFactions(["Tetrads", "The Dark Army", "The Syndicate"]); + if (augmentationExists(AugmentationNames.HemoRecirculator)) { + HemoRecirculator.owned = Augmentations[AugmentationNames.HemoRecirculator].owned; + delete Augmentations[AugmentationNames.HemoRecirculator]; + } + AddToAugmentations(HemoRecirculator); + var Targeting1 = new Augmentation(AugmentationNames.Targeting1); Targeting1.setRequirements(3000, 3000000); Targeting1.setInfo("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.

" + "This augmentation increases the player's dexterity by 10%."); - Targeting1.addToFactions(["The Dark Army", "The Syndicate", "Sector-12", "Volhaven", "Ishima", + Targeting1.addToFactions(["Slum Snakes", "The Dark Army", "The Syndicate", "Sector-12", "Volhaven", "Ishima", "OmniTek Incorporated", "KuaiGong International", "Blade Industries"]); if (augmentationExists(AugmentationNames.Targeting1)) { Targeting1.owned = Augmentations[AugmentationNames.Targeting1].owned; @@ -193,7 +207,7 @@ initAugmentations = function() { CombatRib1.setInfo("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%."); - CombatRib1.addToFactions(["The Dark Army", "The Syndicate", "Sector-12", "Volhaven", "Ishima", + CombatRib1.addToFactions(["Slum Snakes", "The Dark Army", "The Syndicate", "Sector-12", "Volhaven", "Ishima", "OmniTek Incorporated", "KuaiGong International", "Blade Industries"]); if (augmentationExists(AugmentationNames.CombatRib1)) { CombatRib1.owned = Augmentations[AugmentationNames.CombatRib1].owned; @@ -226,7 +240,7 @@ initAugmentations = function() { AddToAugmentations(CombatRib3); var NanofiberWeave = new Augmentation(AugmentationNames.NanofiberWeave); - NanofiberWeave.setRequirements(110000, 250000000); + NanofiberWeave.setRequirements(75000, 250000000); NanofiberWeave.setInfo("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 30%."); @@ -255,11 +269,11 @@ initAugmentations = function() { AddToAugmentations(SubdermalArmor); var WiredReflexes = new Augmentation(AugmentationNames.WiredReflexes); - WiredReflexes.setRequirements(1200, 500000); + WiredReflexes.setRequirements(600, 500000); WiredReflexes.setInfo("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 by 5%."); - WiredReflexes.addToFactions(["Tian Di Hui", "Sector-12", "Volhaven", "Aevum", "Ishima", + WiredReflexes.addToFactions(["Tian Di Hui", "Slum Snakes", "Sector-12", "Volhaven", "Aevum", "Ishima", "The Syndicate", "The Dark Army", "Speakers for the Dead"]); if (augmentationExists(AugmentationNames.WiredReflexes)) { WiredReflexes.owned = Augmentations[AugmentationNames.WiredReflexes].owned; @@ -332,7 +346,7 @@ initAugmentations = function() { //Labor stat augmentations var SpeechProcessor = new Augmentation(AugmentationNames.SpeechProcessor); //Cochlear imlant? - SpeechProcessor.setRequirements(4500, 25000000); + SpeechProcessor.setRequirements(3500, 25000000); SpeechProcessor.setInfo("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 interaction.

" + @@ -591,7 +605,7 @@ initAugmentations = function() { //Work Augmentations var NuoptimalInjectorImplant = new Augmentation(AugmentationNames.NuoptimalInjectorImplant); - NuoptimalInjectorImplant.setRequirements(2000, 3500000); + NuoptimalInjectorImplant.setRequirements(2000, 3000000); NuoptimalInjectorImplant.setInfo("This torso implant automatically injects nootropic supplements into " + "the bloodstream to improve memory, increase focus, and provide other " + "cognitive enhancements.

" + @@ -700,7 +714,7 @@ initAugmentations = function() { //HacknetNode Augmentations var HacknetNodeCPUUpload = new Augmentation(AugmentationNames.HacknetNodeCPUUpload); - HacknetNodeCPUUpload.setRequirements(1500, 3000000); + HacknetNodeCPUUpload.setRequirements(1500, 2000000); HacknetNodeCPUUpload.setInfo("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.

" + @@ -715,7 +729,7 @@ initAugmentations = function() { AddToAugmentations(HacknetNodeCPUUpload); var HacknetNodeCacheUpload = new Augmentation(AugmentationNames.HacknetNodeCacheUpload); - HacknetNodeCacheUpload.setRequirements(1000, 2000000); + HacknetNodeCacheUpload.setRequirements(1000, 1000000); HacknetNodeCacheUpload.setInfo("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.

" + @@ -730,7 +744,7 @@ initAugmentations = function() { AddToAugmentations(HacknetNodeCacheUpload); var HacknetNodeNICUpload = new Augmentation(AugmentationNames.HacknetNodeNICUpload); - HacknetNodeNICUpload.setRequirements(750, 1000000); + HacknetNodeNICUpload.setRequirements(750, 750000); HacknetNodeNICUpload.setInfo("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.

" + @@ -745,7 +759,7 @@ initAugmentations = function() { AddToAugmentations(HacknetNodeNICUpload); var HacknetNodeKernelDNI = new Augmentation(AugmentationNames.HacknetNodeKernelDNI); - HacknetNodeKernelDNI.setRequirements(4000, 10000000); + HacknetNodeKernelDNI.setRequirements(4000, 90000000); HacknetNodeKernelDNI.setInfo("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.

" + @@ -770,17 +784,17 @@ initAugmentations = function() { } AddToAugmentations(HacknetNodeCoreDNI); - //Misc augmentations + //Misc/Hybrid augmentations var NeuroFluxGovernor = new Augmentation(AugmentationNames.NeuroFluxGovernor); if (augmentationExists(AugmentationNames.NeuroFluxGovernor)) { var oldAug = Augmentations[AugmentationNames.NeuroFluxGovernor]; NeuroFluxGovernor.owned = oldAug.owned; NeuroFluxGovernor.level = oldAug.level; mult = Math.pow(CONSTANTS.NeuroFluxGovernorLevelMult, NeuroFluxGovernor.level); - NeuroFluxGovernor.setRequirements(500 * mult, 750000 * mult); + NeuroFluxGovernor.setRequirements(500 * mult, 500000 * mult); delete Augmentations[AugmentationNames.NeuroFluxGovernor]; } else { - NeuroFluxGovernor.setRequirements(500, 750000); + NeuroFluxGovernor.setRequirements(500, 500000); } NeuroFluxGovernor.setInfo("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, " + @@ -792,7 +806,7 @@ initAugmentations = function() { AddToAugmentations(NeuroFluxGovernor); var Neurotrainer1 = new Augmentation(AugmentationNames.Neurotrainer1); - Neurotrainer1.setRequirements(500, 750000); + Neurotrainer1.setRequirements(500, 600000); Neurotrainer1.setInfo("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 " + @@ -806,7 +820,7 @@ initAugmentations = function() { AddToAugmentations(Neurotrainer1); var Neurotrainer2 = new Augmentation(AugmentationNames.Neurotrainer2); - Neurotrainer2.setRequirements(4000, 8000000); + Neurotrainer2.setRequirements(4000, 5000000); Neurotrainer2.setInfo("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.

" + @@ -819,7 +833,7 @@ initAugmentations = function() { AddToAugmentations(Neurotrainer2); var Neurotrainer3 = new Augmentation(AugmentationNames.Neurotrainer3); - Neurotrainer3.setRequirements(10000, 25000000); + Neurotrainer3.setRequirements(10000, 21000000); Neurotrainer3.setInfo("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.

" + @@ -846,6 +860,53 @@ initAugmentations = function() { delete Augmentations[AugmentationNames.Hypersight]; } AddToAugmentations(Hypersight); + + var LuminCloaking1 = new Augmentation(AugmentationNames.LuminCloaking1); + LuminCloaking1.setInfo("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.

" + + "This augmentation:
" + + "Increases the player's agility by 5%
" + + "Increases the amount of money the player gains from crimes by 5%"); + LuminCloaking1.setRequirements(600, 750000); + LuminCloaking1.addToFactions(["Slum Snakes", "Tetrads"]); + if (augmentationExists(AugmentationNames.LuminCloaking1)) { + LuminCloaking1.owned = Augmentations[AugmentationNames.LuminCloaking1].owned; + delete Augmentations[AugmentationNames.LuminCloaking1]; + } + AddToAugmentations(LuminCloaking1); + + var LuminCloaking2 = new Augmentation(AugmentationNames.LuminCloaking2); + LuminCloaking2.setInfo("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, " + + "making the user more resilient as well as stealthy.

" + + "This augmentation:
" + + "Increases the player's agility by 5%
" + + "Increases the player's defense by 5%
" + + "Increases the amount of money the player gains from crimes by 15%"); + LuminCloaking2.setRequirements(3000, 4000000); + LuminCloaking2.addToFactions(["Slum Snakes", "Tetrads"]); + if (augmentationExists(AugmentationNames.LuminCloaking2)) { + LuminCloaking2.owned = Augmentations[AugmentationNames.LuminCloaking2].owned; + delete Augmentations[AugmentationNames.LuminCloaking2]; + } + AddToAugmentations(LuminCloaking2); + + var SmartSonar = new Augmentation(AugmentationNames.SmartSonar); + SmartSonar.setInfo("A cochlear implant that helps the player detect and locate enemies " + + "using sound propagation.

" + + "This augmentation:
" + + "Increases the player's dexterity by 10%
" + + "Increases the player's dexterity experience gain rate by 10%
" + + "Increases the amount of money the player gains from crimes by 20%"); + SmartSonar.setRequirements(10000, 12000000); + SmartSonar.addToFactions(["Slum Snakes"]); + if (augmentationExists(AugmentationNames.SmartSonar)) { + SmartSonar.owned = Augmentations[AugmentationNames.SmartSonar].owned; + delete Augmentations[AugmentationNames.SmartSonar]; + } + AddToAugmentations(SmartSonar); } applyAugmentation = function(aug, faction) { @@ -890,7 +951,7 @@ applyAugmentation = function(aug, faction) { Player.strength_mult *= 1.3; Player.defense_mult *= 1.3; break; - case AugmentationNames.SubdermalArmor: //High level + case AugmentationNames.SubdermalArmor: //High level Player.defense_mult *= 2.5; break; case AugmentationNames.WiredReflexes: //Low level @@ -1100,7 +1161,26 @@ applyAugmentation = function(aug, faction) { Player.hacking_speed_mult *= .99; Player.hacking_money_mult *= 1.1; break; - + case AugmentationNames.LuminCloaking1: + Player.agility_mult *= 1.05; + Player.crime_money_mult *= 1.05; + break; + case AugmentationNames.LuminCloaking2: + Player.agility_mult *= 1.05; + Player.defense_mult *= 1.05; + Player.crime_money_mult *= 1.15; + break; + case AugmentationNames.HemoRecirculator: + Player.strength_mult *= 1.1; + Player.defense_mult *= 1.1; + Player.agility_mult *= 1.1; + Player.dexterity_mult *= 1.1; + break; + case AugmentationNames.SmartSonar: + Player.dexterity_mult *= 1.1; + Player.dexterity_exp_mult *= 1.1; + Player.crime_money_mult *= 1.2; + break; default: throw new Error("ERROR: No such augmentation!"); return; diff --git a/src/Faction.js b/src/Faction.js index 4974c7ded..6b7df4995 100644 --- a/src/Faction.js +++ b/src/Faction.js @@ -23,13 +23,6 @@ Faction.prototype.setInfo = function(inf) { this.info = inf; } -Faction.prototype.reset = function() { - this.isMember = false; - this.isBanned = false; - this.playerReputation = 0; - this.augmentations = []; -} - Faction.prototype.toJSON = function() { return Generic_toJSON("Faction", this); } @@ -140,6 +133,12 @@ initFactions = function() { var Silhouette = new Faction("Silhouette"); Silhouette.setInfo(FactionInfo.SilhouetteInfo); AddToFactions(Silhouette); + var Tetrads = new Faction("Tetrads"); //Low-medium level asian crime gang + Tetrads.setInfo(FactionInfo.TetradsInfo); + AddToFactions(Tetrads); + var SlumSnakes = new Faction("Slum Snakes"); //Low level crime gang + SlumSnakes.setInfo(FactionInfo.SlumSnakesInfo); + AddToFactions(SlumSnakes); //Earlygame factions - factions the player will prestige with early on that don't //belong in other categories @@ -160,6 +159,7 @@ initFactions = function() { PlayerObject.prototype.checkForFactionInvitations = function() { if (Engine.Debug) { console.log("checkForFactionInvitations() called"); + console.log("karma: " + this.karma); } invitedFactions = []; //Array which will hold all Factions th eplayer should be invited to @@ -389,6 +389,23 @@ PlayerObject.prototype.checkForFactionInvitations = function() { invitedFactions.push(silhouetteFac); } + //Tetrads + var tetradsFac = Factions["Tetrads"]; + if (tetradsFac.isBanned == false && tetradsFac.isMember == false && + (this.city == Locations.Chongqing || this.city == Locations.NewTokyo || + this.city == Locations.Ishima) && this.strength >= 75 && this.defense >= 75 && + this.dexterity >= 75 && this.agility >= 75 && this.karma <= -20) { + invitedFactions.push(tetradsFac); + } + + //SlumSnakes + var slumsnakesFac = Factions["Slum Snakes"]; + if (slumsnakesFac.isBanned == false && slumsnakesFac.isMember == false && + this.strength >= 30 && this.defense >= 30 && this.dexterity >= 30 && + this.agility >= 30 && this.karma <= -15 && this.money >= 1000000) { + invitedFactions.push(slumsnakesFac); + } + //Netburners var netburnersFac = Factions["Netburners"]; var totalHacknetRam = 0; diff --git a/src/FactionInfo.js b/src/FactionInfo.js index 0debe2a54..cdd2fa805 100644 --- a/src/FactionInfo.js +++ b/src/FactionInfo.js @@ -113,6 +113,11 @@ FactionInfo = { TheSyndicateInfo: "TODO", SilhouetteInfo: "Corporations are so big, you don't even know who you're working for. That's terror. Terror built into the system.", + + TetradsInfo: "Following the Mandate of HEaven and Carrying out the way", + + SlumSnakesInfo: "Slum Snakes rule!", + //Earlygame factions - factions the player will prestige with early on that don't //belong in other categories diff --git a/src/Player.js b/src/Player.js index e6c39d60a..68256bf60 100644 --- a/src/Player.js +++ b/src/Player.js @@ -115,7 +115,7 @@ function PlayerObject() { this.numTimesHeistTotal = 0; this.numTimesHeistLifetime = 0; - //Achievements and achievement progress + this.crime_money_mult = 1; //Flag to let the engine know the player is starting an action // Current actions: hack, analyze @@ -1042,7 +1042,7 @@ PlayerObject.prototype.startCrime = function(hackExp, strExp, defExp, dexExp, ag this.workDexExpGained = dexExp * this.dexterity_exp_mult; this.workAgiExpGained = agiExp * this.agility_exp_mult; this.workChaExpGained = chaExp * this.charisma_exp_mult; - this.workMoneyGained = money; //TODO multiplier for this? + this.workMoneyGained = money * this.crime_money_mult; this.timeNeededToCompleteWork = time; diff --git a/src/Prestige.js b/src/Prestige.js index 4df41da11..175c4f6c8 100644 --- a/src/Prestige.js +++ b/src/Prestige.js @@ -114,6 +114,8 @@ function prestigeAugmentation() { } AllServers = {}; + + //Reset home computer (only the programs) and add to AllServers homeComp.programs.length = 0; homeComp.runningScripts = []; @@ -125,12 +127,17 @@ function prestigeAugmentation() { Player.currentServer = homeComp.ip; Player.homeComputer = homeComp.ip; AddToAllServers(homeComp); + + //Re-create foreign servers + initForeignServers(); + //Reset statistics of all scripts on home computer for (var i = 0; i < homeComp.scripts.length; ++i) { var s = homeComp.scripts[i]; s.reset(); delete s.moneyStolenMap; s.moneyStolenMap = new AllServersToMoneyMap(); + s.moneyStolenMap.printConsole(); } //Delete all running scripts objects @@ -165,16 +172,21 @@ function prestigeAugmentation() { //Reset Factions for (var member in Factions) { if (Factions.hasOwnProperty(member)) { - Factions[member].reset(); + delete Factions[member]; } } + Factions = {}; - //Re-initialize Augmentations - This will update any changes + //Stop a Terminal action if there is onerror + if (Engine._actionInProgress) { + Engine._actionInProgress = false; + Terminal.finishAction(true); + } + + //Re-initialize things - This will update any changes + initFactions(); initAugmentations(); - - //Inititialization SpecialServerIps = new SpecialServerIpsMap(); - initForeignServers(); initCompanies(); Engine.loadTerminalContent(); diff --git a/src/Script.js b/src/Script.js index 898d2eefe..81ec5d0f6 100644 --- a/src/Script.js +++ b/src/Script.js @@ -302,4 +302,18 @@ function AllServersToMoneyMap() { this[ip] = 0; } } +} + +AllServersToMoneyMap.prototype.printConsole = function() { + console.log("Printing AllServersToMoneyMap"); + for (var ip in this) { + if (this.hasOwnProperty(ip)) { + var serv = AllServers[ip]; + if (serv == null) { + console.log("Warning null server encountered with ip: " + ip); + continue; + } + console.log(ip + "(" + serv.hostname + "): " + this[ip]); + } + } } \ No newline at end of file diff --git a/src/engine.js b/src/engine.js index 04fe00df3..59f9e8828 100644 --- a/src/engine.js +++ b/src/engine.js @@ -268,7 +268,8 @@ var Engine = { 'Hacknet Node level upgrade cost multiplier: ' + formatNumber(Player.hacknet_node_level_cost_mult * 100, 2) + '%

' + 'Company reputation gain multiplier: ' + formatNumber(Player.company_rep_mult * 100, 2) + '%
' + 'Faction reputation gain multiplier: ' + formatNumber(Player.faction_rep_mult * 100, 2) + '%
' + - 'Salary multiplier: ' + formatNumber(Player.work_money_mult * 100, 2) + '%


' + + 'Salary multiplier: ' + formatNumber(Player.work_money_mult * 100, 2) + '%
' + + 'Crime money multiplier: ' + formatNumber(Player.crime_money_mult * 100, 2) + '%


' + 'Misc

' + 'Servers owned: ' + Player.purchasedServers.length + '
' + 'Hacknet Nodes owned: ' + Player.hacknetNodes.length + '

').replace( / /g, " " ); @@ -606,6 +607,8 @@ var Engine = { Engine.displayCharacterInfo(); } else if (Engine.currentPage == Engine.Page.HacknetNodes) { updateHacknetNodesContent(); + } else if (Engine.currentPage == Engine.Page.CreateProgram) { + displayCreateProgramContent(); } Engine.Counters.updateDisplays = 3;