This commit is contained in:
danielyxie 2019-04-19 22:27:33 -07:00 committed by danielyxie
parent 3dd2975c61
commit 7a3a3de7d1
18 changed files with 384 additions and 186 deletions

@ -1,6 +1,7 @@
# Bitburner # Bitburner
Bitburner is a cyberpunk hacking-themed incremental game. The game can be Bitburner is a programming-based [incremental game](https://en.wikipedia.org/wiki/Incremental_game)
played at https://danielyxie.github.io/bitburner. that revolves around hacking and cyberpunk themes.
The game can be played at https://danielyxie.github.io/bitburner.
# Documentation # Documentation
The game's official documentation can be found on [Read The The game's official documentation can be found on [Read The

File diff suppressed because one or more lines are too long

10
dist/vendor.bundle.js vendored

File diff suppressed because one or more lines are too long

@ -40,7 +40,7 @@ solutions. Some may be numbers, others may be strings or arrays.
If a contract asks for a specific solution format, then If a contract asks for a specific solution format, then
use that. Otherwise, follow these rules when submitting solutions: use that. Otherwise, follow these rules when submitting solutions:
* String-type solutions should not have quotation marks surrounding * String-type solutions should **not** have quotation marks surrounding
the string (unless specifically asked for). Only quotation the string (unless specifically asked for). Only quotation
marks that are part of the actual string solution should be included. marks that are part of the actual string solution should be included.
* Array-type solutions should be submitted with each element * Array-type solutions should be submitted with each element

@ -6,10 +6,11 @@ Changelog
v0.46.2 - 4/14/2019 v0.46.2 - 4/14/2019
------------------- -------------------
* Source-File 2 now allows you to form gangs in other BitNodes when your karma reaches a very large negative value * Source-File 2 now allows you to form gangs in other BitNodes when your karma reaches a very large negative value
** (Karma is a hidden stat and is lowered by committing crimes) * (Karma is a hidden stat and is lowered by committing crimes)
* Gang changes: * Gang changes:
** Bug Fix: Gangs can no longer clash with themselve * Bug Fix: Gangs can no longer clash with themselve
** Bug Fix: Winning against another gang should properly reduce their power * Bug Fix: Winning against another gang should properly reduce their power
* Bug Fix: Terminal 'wget' command now works properly * Bug Fix: Terminal 'wget' command now works properly
* Bug Fix: Hacknet Server Hash upgrades now properly reset upon installing Augs/switching BitNodes * Bug Fix: Hacknet Server Hash upgrades now properly reset upon installing Augs/switching BitNodes

@ -5,8 +5,9 @@
Welcome to Bitburner's documentation! Welcome to Bitburner's documentation!
===================================== =====================================
Bitburner is a cyberpunk-themed `incremental game <https://en.wikipedia.org/wiki/Incremental_game>`_ that is currently in the Bitburner is a programming-based `incremental game <https://en.wikipedia.org/wiki/Incremental_game>`_
early beta stage of development. The game `can be played here <https://danielyxie.github.io/bitburner/>`_. that revolves around hacking and cyberpunk themes. The game is currently in the
early beta stage of development. It `can be played here <https://danielyxie.github.io/bitburner/>`_.
What is Bitburner? What is Bitburner?
------------------ ------------------

@ -46,7 +46,7 @@ function initAugmentations() {
clearObject(Augmentations); clearObject(Augmentations);
//Combat stat augmentations //Combat stat augmentations
var HemoRecirculator = new Augmentation({ const HemoRecirculator = new Augmentation({
name:AugmentationNames.HemoRecirculator, moneyCost: 9e6, repCost:4e3, name:AugmentationNames.HemoRecirculator, moneyCost: 9e6, repCost:4e3,
info:"A heart implant that greatly increases the body's ability to effectively use and pump " + info:"A heart implant that greatly increases the body's ability to effectively use and pump " +
"blood.<br><br>" + "blood.<br><br>" +
@ -62,7 +62,7 @@ function initAugmentations() {
} }
AddToAugmentations(HemoRecirculator); AddToAugmentations(HemoRecirculator);
var Targeting1 = new Augmentation({ const Targeting1 = new Augmentation({
name:AugmentationNames.Targeting1, moneyCost:3e6, repCost:2e3, name:AugmentationNames.Targeting1, moneyCost:3e6, repCost:2e3,
info:"This cranial implant is embedded within the player's inner ear structure and optic nerves. It regulates and enhances the user's " + 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 " + "balance and hand-eye coordination. It is also capable of augmenting reality by projecting digital information " +
@ -77,7 +77,7 @@ function initAugmentations() {
} }
AddToAugmentations(Targeting1); AddToAugmentations(Targeting1);
var Targeting2 = new Augmentation({ const Targeting2 = new Augmentation({
name:AugmentationNames.Targeting2, moneyCost:8.5e6, repCost:3.5e3, name:AugmentationNames.Targeting2, moneyCost:8.5e6, repCost:3.5e3,
info:"This is an upgrade of the Augmented Targeting I cranial implant, which is capable of augmenting reality " + 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.<br><br>" + "and enhances the user's balance and hand-eye coordination.<br><br>" +
@ -92,7 +92,7 @@ function initAugmentations() {
} }
AddToAugmentations(Targeting2); AddToAugmentations(Targeting2);
var Targeting3 = new Augmentation({ const Targeting3 = new Augmentation({
name:AugmentationNames.Targeting3, moneyCost:23e6, repCost:11e3, name:AugmentationNames.Targeting3, moneyCost:23e6, repCost:11e3,
info:"This is an upgrade of the Augmented Targeting II cranial implant, which is capable of augmenting reality " + 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.<br><br>" + "and enhances the user's balance and hand-eye coordination.<br><br>" +
@ -107,7 +107,7 @@ function initAugmentations() {
} }
AddToAugmentations(Targeting3); AddToAugmentations(Targeting3);
var SyntheticHeart = new Augmentation({ const SyntheticHeart = new Augmentation({
name:AugmentationNames.SyntheticHeart, moneyCost:575e6, repCost:300e3, name:AugmentationNames.SyntheticHeart, moneyCost:575e6, repCost:300e3,
info:"This advanced artificial heart, created from plasteel and graphene, is capable of pumping more blood " + 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.<br><br>" + "at much higher efficiencies than a normal human heart.<br><br>" +
@ -122,7 +122,7 @@ function initAugmentations() {
} }
AddToAugmentations(SyntheticHeart); AddToAugmentations(SyntheticHeart);
var SynfibrilMuscle = new Augmentation({ const SynfibrilMuscle = new Augmentation({
name:AugmentationNames.SynfibrilMuscle, repCost:175e3, moneyCost:225e6, name:AugmentationNames.SynfibrilMuscle, repCost:175e3, moneyCost:225e6,
info:"The myofibrils in human muscles are injected with special chemicals that react with the proteins inside " + 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. " + "the myofibrils, altering their underlying structure. The end result is muscles that are stronger and more elastic. " +
@ -138,7 +138,7 @@ function initAugmentations() {
} }
AddToAugmentations(SynfibrilMuscle) AddToAugmentations(SynfibrilMuscle)
var CombatRib1 = new Augmentation({ const CombatRib1 = new Augmentation({
name:AugmentationNames.CombatRib1, repCost:3e3, moneyCost:4750000, name:AugmentationNames.CombatRib1, repCost:3e3, moneyCost:4750000,
info:"The human body's ribs are replaced with artificial ribs that automatically and continuously release cognitive " + 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.<br><br>" + "and performance-enhancing drugs into the bloodstream, improving the user's abilities in combat.<br><br>" +
@ -153,7 +153,7 @@ function initAugmentations() {
} }
AddToAugmentations(CombatRib1); AddToAugmentations(CombatRib1);
var CombatRib2 = new Augmentation({ const CombatRib2 = new Augmentation({
name:AugmentationNames.CombatRib2, repCost:7.5e3, moneyCost:13e6, name:AugmentationNames.CombatRib2, repCost:7.5e3, moneyCost:13e6,
info:"This is an upgrade to the Combat Rib I augmentation, and is capable of releasing even more potent combat-enhancing " + 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.<br><br>" + "drugs into the bloodstream.<br><br>" +
@ -169,7 +169,7 @@ function initAugmentations() {
} }
AddToAugmentations(CombatRib2); AddToAugmentations(CombatRib2);
var CombatRib3 = new Augmentation({ const CombatRib3 = new Augmentation({
name:AugmentationNames.CombatRib3, repCost:14e3, moneyCost:24e6, name:AugmentationNames.CombatRib3, repCost:14e3, moneyCost:24e6,
info:"This is an upgrade to the Combat Rib II augmentation, and is capable of releasing even more potent combat-enhancing " + 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<br><br>." + "drugs into the bloodstream<br><br>." +
@ -185,7 +185,7 @@ function initAugmentations() {
} }
AddToAugmentations(CombatRib3); AddToAugmentations(CombatRib3);
var NanofiberWeave = new Augmentation({ const NanofiberWeave = new Augmentation({
name:AugmentationNames.NanofiberWeave, repCost:15e3, moneyCost:25e6, name:AugmentationNames.NanofiberWeave, repCost:15e3, moneyCost:25e6,
info:"Synthetic nanofibers are woven into the skin's extracellular matrix using electrospinning. " + 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.<br><br>" + "This improves the skin's ability to regenerate itself and protect the body from external stresses and forces.<br><br>" +
@ -200,7 +200,7 @@ function initAugmentations() {
} }
AddToAugmentations(NanofiberWeave); AddToAugmentations(NanofiberWeave);
var SubdermalArmor = new Augmentation({ const SubdermalArmor = new Augmentation({
name:AugmentationNames.SubdermalArmor, repCost:350e3, moneyCost:650e6, name:AugmentationNames.SubdermalArmor, repCost:350e3, moneyCost:650e6,
info:"The NEMEAN Subdermal Weave is a thin, light-weight, graphene plating that houses a dilatant fluid. " + 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 " + "The material is implanted underneath the skin, and is the most advanced form of defensive enhancement " +
@ -217,7 +217,7 @@ function initAugmentations() {
} }
AddToAugmentations(SubdermalArmor); AddToAugmentations(SubdermalArmor);
var WiredReflexes = new Augmentation({ const WiredReflexes = new Augmentation({
name:AugmentationNames.WiredReflexes, repCost:500, moneyCost:500e3, name:AugmentationNames.WiredReflexes, repCost:500, moneyCost:500e3,
info:"Synthetic nerve-enhancements are injected into all major parts of the somatic nervous system, " + 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.<br><br>" + "supercharging the body's ability to send signals through neurons. This results in increased reflex speed.<br><br>" +
@ -232,7 +232,7 @@ function initAugmentations() {
} }
AddToAugmentations(WiredReflexes); AddToAugmentations(WiredReflexes);
var GrapheneBoneLacings = new Augmentation({ const GrapheneBoneLacings = new Augmentation({
name:AugmentationNames.GrapheneBoneLacings, repCost:450e3, moneyCost:850e6, name:AugmentationNames.GrapheneBoneLacings, repCost:450e3, moneyCost:850e6,
info:"A graphene-based material is grafted and fused into the user's bones, significantly increasing " + info:"A graphene-based material is grafted and fused into the user's bones, significantly increasing " +
"their density and tensile strength.<br><br>" + "their density and tensile strength.<br><br>" +
@ -246,7 +246,7 @@ function initAugmentations() {
} }
AddToAugmentations(GrapheneBoneLacings); AddToAugmentations(GrapheneBoneLacings);
var BionicSpine = new Augmentation({ const BionicSpine = new Augmentation({
name:AugmentationNames.BionicSpine, repCost:18e3, moneyCost:25e6, name:AugmentationNames.BionicSpine, repCost:18e3, moneyCost:25e6,
info:"An artificial spine created from plasteel and carbon fibers that completely replaces the organic spine. " + 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 " + "Not only is the Bionic Spine physically stronger than a human spine, but it is also capable of digitally " +
@ -265,7 +265,7 @@ function initAugmentations() {
} }
AddToAugmentations(BionicSpine); AddToAugmentations(BionicSpine);
var GrapheneBionicSpine = new Augmentation({ const GrapheneBionicSpine = new Augmentation({
name:AugmentationNames.GrapheneBionicSpine, repCost:650e3, moneyCost:1200e6, name:AugmentationNames.GrapheneBionicSpine, repCost:650e3, moneyCost:1200e6,
info:"An upgrade to the Bionic Spine augmentation. It fuses the implant with an advanced graphene " + info:"An upgrade to the Bionic Spine augmentation. It fuses the implant with an advanced graphene " +
"material to make it much stronger and lighter.<br><br>" + "material to make it much stronger and lighter.<br><br>" +
@ -282,7 +282,7 @@ function initAugmentations() {
} }
AddToAugmentations(GrapheneBionicSpine); AddToAugmentations(GrapheneBionicSpine);
var BionicLegs = new Augmentation({ const BionicLegs = new Augmentation({
name:AugmentationNames.BionicLegs, repCost:60e3, moneyCost:75e6, name:AugmentationNames.BionicLegs, repCost:60e3, moneyCost:75e6,
info:"Cybernetic legs created from plasteel and carbon fibers that completely replace the user's organic legs.<br><br>" + info:"Cybernetic legs created from plasteel and carbon fibers that completely replace the user's organic legs.<br><br>" +
"This augmentation increases the player's agility by 60%.", "This augmentation increases the player's agility by 60%.",
@ -295,7 +295,7 @@ function initAugmentations() {
} }
AddToAugmentations(BionicLegs); AddToAugmentations(BionicLegs);
var GrapheneBionicLegs = new Augmentation({ const GrapheneBionicLegs = new Augmentation({
name:AugmentationNames.GrapheneBionicLegs, repCost:300e3, moneyCost:900e6, name:AugmentationNames.GrapheneBionicLegs, repCost:300e3, moneyCost:900e6,
info:"An upgrade to the Bionic Legs augmentation. It fuses the implant with an advanced graphene " + info:"An upgrade to the Bionic Legs augmentation. It fuses the implant with an advanced graphene " +
"material to make it much stronger and lighter.<br><br>" + "material to make it much stronger and lighter.<br><br>" +
@ -309,8 +309,8 @@ function initAugmentations() {
} }
AddToAugmentations(GrapheneBionicLegs); AddToAugmentations(GrapheneBionicLegs);
//Labor stat augmentations // Work stat augmentations
var SpeechProcessor = new Augmentation({ const SpeechProcessor = new Augmentation({
name:AugmentationNames.SpeechProcessor, repCost:3e3, moneyCost:10e6, name:AugmentationNames.SpeechProcessor, repCost:3e3, moneyCost:10e6,
info:"A cochlear implant with an embedded computer that analyzes incoming speech. " + info:"A cochlear implant with an embedded computer that analyzes incoming speech. " +
"The embedded computer processes characteristics of incoming speech, such as tone " + "The embedded computer processes characteristics of incoming speech, such as tone " +
@ -325,7 +325,7 @@ function initAugmentations() {
} }
AddToAugmentations(SpeechProcessor); AddToAugmentations(SpeechProcessor);
let TITN41Injection = new Augmentation({ const TITN41Injection = new Augmentation({
name:AugmentationNames.TITN41Injection, repCost:10e3, moneyCost:38e6, name:AugmentationNames.TITN41Injection, repCost:10e3, moneyCost:38e6,
info:"TITN is a series of viruses that targets and alters the sequences of human DNA in genes that " + 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 " + "control personality. The TITN-41 strain alters these genes so that the subject becomes more " +
@ -340,7 +340,7 @@ function initAugmentations() {
} }
AddToAugmentations(TITN41Injection); AddToAugmentations(TITN41Injection);
var EnhancedSocialInteractionImplant = new Augmentation({ const EnhancedSocialInteractionImplant = new Augmentation({
name:AugmentationNames.EnhancedSocialInteractionImplant, repCost:150e3, moneyCost:275e6, name:AugmentationNames.EnhancedSocialInteractionImplant, repCost:150e3, moneyCost:275e6,
info:"A cranial implant that greatly assists in the user's ability to analyze social situations " + 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 " + "and interactions. The system uses a wide variety of factors such as facial expression, body " +
@ -359,7 +359,7 @@ function initAugmentations() {
AddToAugmentations(EnhancedSocialInteractionImplant); AddToAugmentations(EnhancedSocialInteractionImplant);
// Hacking augmentations // Hacking augmentations
var BitWire = new Augmentation({ const BitWire = new Augmentation({
name:AugmentationNames.BitWire, repCost:1500, moneyCost:2e6, name:AugmentationNames.BitWire, repCost:1500, moneyCost:2e6,
info: "A small brain implant embedded in the cerebrum. This regulates and improves the brain's computing " + info: "A small brain implant embedded in the cerebrum. This regulates and improves the brain's computing " +
"capabilities.<br><br>" + "capabilities.<br><br>" +
@ -372,7 +372,7 @@ function initAugmentations() {
} }
AddToAugmentations(BitWire); AddToAugmentations(BitWire);
var ArtificialBioNeuralNetwork = new Augmentation({ const ArtificialBioNeuralNetwork = new Augmentation({
name:AugmentationNames.ArtificialBioNeuralNetwork, repCost:110e3, moneyCost:600e6, name:AugmentationNames.ArtificialBioNeuralNetwork, repCost:110e3, moneyCost:600e6,
info:"A network consisting of millions of nanoprocessors is embedded into the brain. " + 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 mimick the way a biological brain solves a problem, which each " +
@ -393,7 +393,7 @@ function initAugmentations() {
} }
AddToAugmentations(ArtificialBioNeuralNetwork); AddToAugmentations(ArtificialBioNeuralNetwork);
var ArtificialSynapticPotentiation = new Augmentation({ const ArtificialSynapticPotentiation = new Augmentation({
name:AugmentationNames.ArtificialSynapticPotentiation, repCost:2500, moneyCost:16e6, name:AugmentationNames.ArtificialSynapticPotentiation, repCost:2500, moneyCost:16e6,
info:"The body is injected with a chemical that artificially induces synaptic potentiation, " + info:"The body is injected with a chemical that artificially induces synaptic potentiation, " +
"otherwise known as the strengthening of synapses. This results in a enhanced cognitive abilities.<br><br>" + "otherwise known as the strengthening of synapses. This results in a enhanced cognitive abilities.<br><br>" +
@ -411,7 +411,7 @@ function initAugmentations() {
} }
AddToAugmentations(ArtificialSynapticPotentiation); AddToAugmentations(ArtificialSynapticPotentiation);
var EnhancedMyelinSheathing = new Augmentation({ const EnhancedMyelinSheathing = new Augmentation({
name:AugmentationNames.EnhancedMyelinSheathing, repCost:40e3, moneyCost:275e6, name:AugmentationNames.EnhancedMyelinSheathing, repCost:40e3, moneyCost:275e6,
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 myelinogensis in the human body. " +
"This process results in the proliferation of new, synthetic myelin sheaths in the nervous " + "This process results in the proliferation of new, synthetic myelin sheaths in the nervous " +
@ -431,7 +431,7 @@ function initAugmentations() {
} }
AddToAugmentations(EnhancedMyelinSheathing); AddToAugmentations(EnhancedMyelinSheathing);
var SynapticEnhancement = new Augmentation({ const SynapticEnhancement = new Augmentation({
name:AugmentationNames.SynapticEnhancement, repCost:800, moneyCost:1.5e6, name:AugmentationNames.SynapticEnhancement, repCost:800, moneyCost:1.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 electric signals to stimulate the brain and " +
"induce stronger synaptic activity. This improves the user's cognitive abilities.<br><br>" + "induce stronger synaptic activity. This improves the user's cognitive abilities.<br><br>" +
@ -444,7 +444,7 @@ function initAugmentations() {
} }
AddToAugmentations(SynapticEnhancement); AddToAugmentations(SynapticEnhancement);
var NeuralRetentionEnhancement = new Augmentation({ const NeuralRetentionEnhancement = new Augmentation({
name:AugmentationNames.NeuralRetentionEnhancement, repCost:8e3, moneyCost:50e6, name:AugmentationNames.NeuralRetentionEnhancement, repCost:8e3, moneyCost:50e6,
info:"Chemical injections are used to permanently alter and strengthen the brain's neuronal " + info:"Chemical injections are used to permanently alter and strengthen the brain's neuronal " +
"circuits, strengthening its ability to retain information.<br><br>" + "circuits, strengthening its ability to retain information.<br><br>" +
@ -457,7 +457,7 @@ function initAugmentations() {
} }
AddToAugmentations(NeuralRetentionEnhancement); AddToAugmentations(NeuralRetentionEnhancement);
var DataJack = new Augmentation({ const DataJack = new Augmentation({
name:AugmentationNames.DataJack, repCost:45e3, moneyCost:90e6, name:AugmentationNames.DataJack, repCost:45e3, moneyCost:90e6,
info:"A brain implant that provides an interface for direct, wireless communication between a computer's main " + 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 " + "memory and the mind. This implant allows the user to not only access a computer's memory, but also alter " +
@ -471,7 +471,7 @@ function initAugmentations() {
} }
AddToAugmentations(DataJack); AddToAugmentations(DataJack);
var ENM = new Augmentation({ const ENM = new Augmentation({
name:AugmentationNames.ENM, repCost:6e3, moneyCost:50e6, name:AugmentationNames.ENM, repCost:6e3, moneyCost:50e6,
info:"A thin device embedded inside the arm containing a wireless module capable of connecting " + 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 " + "to nearby networks. Once connected, the Netburner Module is capable of capturing and " +
@ -488,7 +488,7 @@ function initAugmentations() {
} }
AddToAugmentations(ENM); AddToAugmentations(ENM);
var ENMCore = new Augmentation({ const ENMCore = new Augmentation({
name:AugmentationNames.ENMCore, repCost:100e3, moneyCost:500e6, name:AugmentationNames.ENMCore, repCost:100e3, moneyCost:500e6,
info:"The Core library is an implant that upgrades the firmware of the Embedded Netburner Module. " + 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.<br><br>" + "This upgrade allows the Embedded Netburner Module to generate its own data on a network.<br><br>" +
@ -512,7 +512,7 @@ function initAugmentations() {
} }
AddToAugmentations(ENMCore); AddToAugmentations(ENMCore);
var ENMCoreV2 = new Augmentation({ const ENMCoreV2 = new Augmentation({
name:AugmentationNames.ENMCoreV2, repCost:400e3, moneyCost:900e6, name:AugmentationNames.ENMCoreV2, repCost:400e3, moneyCost:900e6,
info:"The Core V2 library is an implant that upgrades the firmware of the Embedded Netburner Module. " + 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 " + "This upgraded firmware allows the Embedded Netburner Module to control the information on " +
@ -538,7 +538,7 @@ function initAugmentations() {
} }
AddToAugmentations(ENMCoreV2); AddToAugmentations(ENMCoreV2);
var ENMCoreV3 = new Augmentation({ const ENMCoreV3 = new Augmentation({
name:AugmentationNames.ENMCoreV3, repCost:700e3, moneyCost:1500e6, name:AugmentationNames.ENMCoreV3, repCost:700e3, moneyCost:1500e6,
info:"The Core V3 library is an implant that upgrades the firmware of the Embedded Netburner Module. " + 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 " + "This upgraded firmware allows the Embedded Netburner Module to seamlessly inject code into " +
@ -563,7 +563,7 @@ function initAugmentations() {
} }
AddToAugmentations(ENMCoreV3); AddToAugmentations(ENMCoreV3);
var ENMAnalyzeEngine = new Augmentation({ const ENMAnalyzeEngine = new Augmentation({
name:AugmentationNames.ENMAnalyzeEngine, repCost:250e3, moneyCost:1200e6, name:AugmentationNames.ENMAnalyzeEngine, repCost:250e3, moneyCost:1200e6,
info:"Installs the Analyze Engine for the Embedded Netburner Module, which is a CPU cluster " + 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.<br><br>" + "that vastly outperforms the Netburner Module's native single-core processor.<br><br>" +
@ -578,7 +578,7 @@ function initAugmentations() {
} }
AddToAugmentations(ENMAnalyzeEngine); AddToAugmentations(ENMAnalyzeEngine);
var ENMDMA = new Augmentation({ const ENMDMA = new Augmentation({
name:AugmentationNames.ENMDMA, repCost:400e3, moneyCost:1400e6, name:AugmentationNames.ENMDMA, repCost:400e3, moneyCost:1400e6,
info:"This implant installs a Direct Memory Access (DMA) controller into the " + info:"This implant installs a Direct Memory Access (DMA) controller into the " +
"Embedded Netburner Module. This allows the Module to send and receive data " + "Embedded Netburner Module. This allows the Module to send and receive data " +
@ -597,7 +597,7 @@ function initAugmentations() {
} }
AddToAugmentations(ENMDMA); AddToAugmentations(ENMDMA);
var Neuralstimulator = new Augmentation({ const Neuralstimulator = new Augmentation({
name:AugmentationNames.Neuralstimulator, repCost:20e3, moneyCost:600e6, name:AugmentationNames.Neuralstimulator, repCost:20e3, moneyCost:600e6,
info:"A cranial implant that intelligently stimulates certain areas of the brain " + info:"A cranial implant that intelligently stimulates certain areas of the brain " +
"in order to improve cognitive functions.<br><br>" + "in order to improve cognitive functions.<br><br>" +
@ -617,7 +617,7 @@ function initAugmentations() {
} }
AddToAugmentations(Neuralstimulator); AddToAugmentations(Neuralstimulator);
var NeuralAccelerator = new Augmentation({ const NeuralAccelerator = new Augmentation({
name:AugmentationNames.NeuralAccelerator, repCost:80e3, moneyCost:350e6, name:AugmentationNames.NeuralAccelerator, repCost:80e3, moneyCost:350e6,
info:"A microprocessor that accelerates the processing " + info:"A microprocessor that accelerates the processing " +
"speed of biological neural networks. This is a cranial implant that is embedded inside the brain.<br><br>" + "speed of biological neural networks. This is a cranial implant that is embedded inside the brain.<br><br>" +
@ -635,7 +635,7 @@ function initAugmentations() {
} }
AddToAugmentations(NeuralAccelerator); AddToAugmentations(NeuralAccelerator);
var CranialSignalProcessorsG1 = new Augmentation({ const CranialSignalProcessorsG1 = new Augmentation({
name:AugmentationNames.CranialSignalProcessorsG1, repCost:4e3, moneyCost:14e6, name:AugmentationNames.CranialSignalProcessorsG1, repCost:4e3, moneyCost:14e6,
info:"The first generation of Cranial Signal Processors. Cranial Signal Processors " + info:"The first generation of Cranial Signal Processors. Cranial Signal Processors " +
"are a set of specialized microprocessors that are attached to " + "are a set of specialized microprocessors that are attached to " +
@ -653,7 +653,7 @@ function initAugmentations() {
} }
AddToAugmentations(CranialSignalProcessorsG1); AddToAugmentations(CranialSignalProcessorsG1);
var CranialSignalProcessorsG2 = new Augmentation({ const CranialSignalProcessorsG2 = new Augmentation({
name:AugmentationNames.CranialSignalProcessorsG2, repCost:7500, moneyCost:25e6, name:AugmentationNames.CranialSignalProcessorsG2, repCost:7500, moneyCost:25e6,
info:"The second generation of Cranial Signal Processors. Cranial Signal Processors " + info:"The second generation of Cranial Signal Processors. Cranial Signal Processors " +
"are a set of specialized microprocessors that are attached to " + "are a set of specialized microprocessors that are attached to " +
@ -674,7 +674,7 @@ function initAugmentations() {
} }
AddToAugmentations(CranialSignalProcessorsG2); AddToAugmentations(CranialSignalProcessorsG2);
var CranialSignalProcessorsG3 = new Augmentation({ const CranialSignalProcessorsG3 = new Augmentation({
name:AugmentationNames.CranialSignalProcessorsG3, repCost:20e3, moneyCost:110e6, name:AugmentationNames.CranialSignalProcessorsG3, repCost:20e3, moneyCost:110e6,
info:"The third generation of Cranial Signal Processors. Cranial Signal Processors " + info:"The third generation of Cranial Signal Processors. Cranial Signal Processors " +
"are a set of specialized microprocessors that are attached to " + "are a set of specialized microprocessors that are attached to " +
@ -695,7 +695,7 @@ function initAugmentations() {
} }
AddToAugmentations(CranialSignalProcessorsG3); AddToAugmentations(CranialSignalProcessorsG3);
var CranialSignalProcessorsG4 = new Augmentation({ const CranialSignalProcessorsG4 = new Augmentation({
name:AugmentationNames.CranialSignalProcessorsG4, repCost:50e3, moneyCost:220e6, name:AugmentationNames.CranialSignalProcessorsG4, repCost:50e3, moneyCost:220e6,
info:"The fourth generation of Cranial Signal Processors. Cranial Signal Processors " + info:"The fourth generation of Cranial Signal Processors. Cranial Signal Processors " +
"are a set of specialized microprocessors that are attached to " + "are a set of specialized microprocessors that are attached to " +
@ -716,7 +716,7 @@ function initAugmentations() {
} }
AddToAugmentations(CranialSignalProcessorsG4); AddToAugmentations(CranialSignalProcessorsG4);
var CranialSignalProcessorsG5 = new Augmentation({ const CranialSignalProcessorsG5 = new Augmentation({
name:AugmentationNames.CranialSignalProcessorsG5, repCost:100e3, moneyCost:450e6, name:AugmentationNames.CranialSignalProcessorsG5, repCost:100e3, moneyCost:450e6,
info:"The fifth generation of Cranial Signal Processors. Cranial Signal Processors " + info:"The fifth generation of Cranial Signal Processors. Cranial Signal Processors " +
"are a set of specialized microprocessors that are attached to " + "are a set of specialized microprocessors that are attached to " +
@ -737,7 +737,7 @@ function initAugmentations() {
} }
AddToAugmentations(CranialSignalProcessorsG5); AddToAugmentations(CranialSignalProcessorsG5);
var NeuronalDensification = new Augmentation({ const NeuronalDensification = new Augmentation({
name:AugmentationNames.NeuronalDensification, repCost:75e3, moneyCost:275e6, name:AugmentationNames.NeuronalDensification, repCost:75e3, moneyCost:275e6,
info:"The brain is surgically re-engineered to have increased neuronal density " + info:"The brain is surgically re-engineered to have increased neuronal density " +
"by decreasing the neuron gap junction. Then, the body is genetically modified " + "by decreasing the neuron gap junction. Then, the body is genetically modified " +
@ -757,7 +757,7 @@ function initAugmentations() {
AddToAugmentations(NeuronalDensification); AddToAugmentations(NeuronalDensification);
// Work Augmentations // Work Augmentations
var NuoptimalInjectorImplant = new Augmentation({ const NuoptimalInjectorImplant = new Augmentation({
name:AugmentationNames.NuoptimalInjectorImplant, repCost:2e3, moneyCost:4e6, name:AugmentationNames.NuoptimalInjectorImplant, repCost:2e3, moneyCost:4e6,
info:"This torso implant automatically injects nootropic supplements into " + info:"This torso implant automatically injects nootropic supplements into " +
"the bloodstream to improve memory, increase focus, and provide other " + "the bloodstream to improve memory, increase focus, and provide other " +
@ -773,7 +773,7 @@ function initAugmentations() {
} }
AddToAugmentations(NuoptimalInjectorImplant); AddToAugmentations(NuoptimalInjectorImplant);
var SpeechEnhancement = new Augmentation({ const SpeechEnhancement = new Augmentation({
name:AugmentationNames.SpeechEnhancement, repCost:1e3, moneyCost:2.5e6, name:AugmentationNames.SpeechEnhancement, repCost:1e3, moneyCost:2.5e6,
info:"An advanced neural implant that improves your speaking abilities, making " + info:"An advanced neural implant that improves your speaking abilities, making " +
"you more convincing and likable in conversations and overall improving your " + "you more convincing and likable in conversations and overall improving your " +
@ -791,7 +791,7 @@ function initAugmentations() {
} }
AddToAugmentations(SpeechEnhancement); AddToAugmentations(SpeechEnhancement);
var FocusWire = new Augmentation({ const FocusWire = new Augmentation({
name:AugmentationNames.FocusWire, repCost:30e3, moneyCost:180e6, name:AugmentationNames.FocusWire, repCost:30e3, moneyCost:180e6,
info:"A cranial implant that stops procrastination by blocking specific neural pathways " + info:"A cranial implant that stops procrastination by blocking specific neural pathways " +
"in the brain.<br><br>" + "in the brain.<br><br>" +
@ -814,7 +814,7 @@ function initAugmentations() {
} }
AddToAugmentations(FocusWire) AddToAugmentations(FocusWire)
var PCDNI = new Augmentation({ const PCDNI = new Augmentation({
name:AugmentationNames.PCDNI, repCost:150e3, moneyCost:750e6, name:AugmentationNames.PCDNI, repCost:150e3, moneyCost:750e6,
info:"Installs a Direct-Neural Interface jack into your arm that is compatible with most " + 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 " + "computers. Connecting to a computer through this jack allows you to interface with " +
@ -831,7 +831,7 @@ function initAugmentations() {
} }
AddToAugmentations(PCDNI); AddToAugmentations(PCDNI);
var PCDNIOptimizer = new Augmentation({ const PCDNIOptimizer = new Augmentation({
name:AugmentationNames.PCDNIOptimizer, repCost:200e3, moneyCost:900e6, name:AugmentationNames.PCDNIOptimizer, repCost:200e3, moneyCost:900e6,
info:"This is a submodule upgrade to the PC Direct-Neural Interface augmentation. It " + 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 " + "improves the performance of the interface and gives the user more control options " +
@ -849,7 +849,7 @@ function initAugmentations() {
} }
AddToAugmentations(PCDNIOptimizer); AddToAugmentations(PCDNIOptimizer);
var PCDNINeuralNetwork = new Augmentation({ const PCDNINeuralNetwork = new Augmentation({
name:AugmentationNames.PCDNINeuralNetwork, repCost:600e3, moneyCost:1500e6, name:AugmentationNames.PCDNINeuralNetwork, repCost:600e3, moneyCost:1500e6,
info:"This is an additional installation that upgrades the functionality of the " + info:"This is an additional installation that upgrades the functionality of the " +
"PC Direct-Neural Interface augmentation. When connected to a computer, " + "PC Direct-Neural Interface augmentation. When connected to a computer, " +
@ -870,7 +870,7 @@ function initAugmentations() {
} }
AddToAugmentations(PCDNINeuralNetwork); AddToAugmentations(PCDNINeuralNetwork);
var ADRPheromone1 = new Augmentation({ const ADRPheromone1 = new Augmentation({
name:AugmentationNames.ADRPheromone1, repCost:1500, moneyCost:3.5e6, name:AugmentationNames.ADRPheromone1, repCost:1500, moneyCost:3.5e6,
info:"The body is genetically re-engineered so that it produces the ADR-V1 pheromone, " + 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, " + "an artificial pheromone discovered by scientists. The ADR-V1 pheromone, when excreted, " +
@ -887,7 +887,7 @@ function initAugmentations() {
} }
AddToAugmentations(ADRPheromone1); AddToAugmentations(ADRPheromone1);
var ADRPheromone2 = new Augmentation({ const ADRPheromone2 = new Augmentation({
name:AugmentationNames.ADRPheromone2, repCost:25e3, moneyCost:110e6, name:AugmentationNames.ADRPheromone2, repCost:25e3, moneyCost:110e6,
info:"The body is genetically re-engineered so that it produces the ADR-V2 pheromone, " + 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, " + "which is similar to but more potent than ADR-V1. This pheromone, when excreted, " +
@ -903,8 +903,26 @@ function initAugmentations() {
} }
AddToAugmentations(ADRPheromone2); AddToAugmentations(ADRPheromone2);
const ShadowsSimulacrum = new Augmentation({
name: AugmentationNames.ShadowsSimulacrum, repCost: 15e3, moneyCost: 80e6,
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 " +
"simulacrums within a large radius. These simulacrums are commonly used for " +
"espionage and surveillance work.<br><br>" +
"This augmentation:<br>" +
"Increases the amount of reputation the player gains when working for a faction or company by 15%.",
company_rep_mult: 1.15,
faction_rep_mult: 1.15,
});
ShadowsSimulacrum.addToFactions(["The Syndicate", "The Dark Army", "Speakers for the Dead"]);
if (augmentationExists(AugmentationNames.ShadowsSimulacrum)) {
delete Augmentations[AugmentationNames.ShadowsSimulacrum];
}
AddToAugmentations(ShadowsSimulacrum);
// HacknetNode Augmentations // HacknetNode Augmentations
var HacknetNodeCPUUpload = new Augmentation({ const HacknetNodeCPUUpload = new Augmentation({
name:AugmentationNames.HacknetNodeCPUUpload, repCost:1500, moneyCost:2.2e6, name:AugmentationNames.HacknetNodeCPUUpload, repCost:1500, moneyCost:2.2e6,
info:"Uploads the architecture and design details of a Hacknet Node's CPU into " + 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 " + "the brain. This allows the user to engineer custom hardware and software " +
@ -921,7 +939,7 @@ function initAugmentations() {
} }
AddToAugmentations(HacknetNodeCPUUpload); AddToAugmentations(HacknetNodeCPUUpload);
var HacknetNodeCacheUpload = new Augmentation({ const HacknetNodeCacheUpload = new Augmentation({
name:AugmentationNames.HacknetNodeCacheUpload, repCost:1e3, moneyCost:1.1e6, name:AugmentationNames.HacknetNodeCacheUpload, repCost:1e3, moneyCost:1.1e6,
info:"Uploads the architecture and design details of a Hacknet Node's main-memory cache " + 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 " + "into the brain. This allows the user to engineer custom cache hardware for the " +
@ -938,7 +956,7 @@ function initAugmentations() {
} }
AddToAugmentations(HacknetNodeCacheUpload); AddToAugmentations(HacknetNodeCacheUpload);
var HacknetNodeNICUpload = new Augmentation({ const HacknetNodeNICUpload = new Augmentation({
name:AugmentationNames.HacknetNodeNICUpload, repCost:750, moneyCost:900e3, name:AugmentationNames.HacknetNodeNICUpload, repCost:750, moneyCost:900e3,
info:"Uploads the architecture and design details of a Hacknet Node's Network Interface Card (NIC) " + 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 " + "into the brain. This allows the user to engineer a custom NIC for the Hacknet Node that " +
@ -955,7 +973,7 @@ function initAugmentations() {
} }
AddToAugmentations(HacknetNodeNICUpload); AddToAugmentations(HacknetNodeNICUpload);
var HacknetNodeKernelDNI = new Augmentation({ const HacknetNodeKernelDNI = new Augmentation({
name:AugmentationNames.HacknetNodeKernelDNI, repCost:3e3, moneyCost:8e6, name:AugmentationNames.HacknetNodeKernelDNI, repCost:3e3, moneyCost:8e6,
info:"Installs a Direct-Neural Interface jack into the arm that is capable of connecting to a " + 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 the mind's " +
@ -969,7 +987,7 @@ function initAugmentations() {
} }
AddToAugmentations(HacknetNodeKernelDNI); AddToAugmentations(HacknetNodeKernelDNI);
var HacknetNodeCoreDNI = new Augmentation({ const HacknetNodeCoreDNI = new Augmentation({
name:AugmentationNames.HacknetNodeCoreDNI, repCost:5e3, moneyCost:12e6, name:AugmentationNames.HacknetNodeCoreDNI, repCost:5e3, moneyCost:12e6,
info:"Installs a Direct-Neural Interface jack into the arm that is capable of connecting " + 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 " + "to a Hacknet Node. This lets the user access and manipulate the Node's processing logic using " +
@ -984,7 +1002,7 @@ function initAugmentations() {
AddToAugmentations(HacknetNodeCoreDNI); AddToAugmentations(HacknetNodeCoreDNI);
//Misc/Hybrid augmentations //Misc/Hybrid augmentations
var NeuroFluxGovernor = new Augmentation({ const NeuroFluxGovernor = new Augmentation({
name:AugmentationNames.NeuroFluxGovernor, repCost:500, moneyCost: 750e3, name:AugmentationNames.NeuroFluxGovernor, repCost:500, moneyCost: 750e3,
info:"A device that is embedded in the back of the neck. The NeuroFlux Governor " + 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, " + "monitors and regulates nervous impulses coming to and from the spinal column, " +
@ -1037,7 +1055,7 @@ function initAugmentations() {
++nextLevel; ++nextLevel;
} }
} }
mult = Math.pow(CONSTANTS.NeuroFluxGovernorLevelMult, nextLevel); let mult = Math.pow(CONSTANTS.NeuroFluxGovernorLevelMult, nextLevel);
NeuroFluxGovernor.baseRepRequirement = 500 * mult * CONSTANTS.AugmentationRepMultiplier * BitNodeMultipliers.AugmentationRepCost; NeuroFluxGovernor.baseRepRequirement = 500 * mult * CONSTANTS.AugmentationRepMultiplier * BitNodeMultipliers.AugmentationRepCost;
NeuroFluxGovernor.baseCost = 750e3 * mult * CONSTANTS.AugmentationCostMultiplier * BitNodeMultipliers.AugmentationMoneyCost; NeuroFluxGovernor.baseCost = 750e3 * mult * CONSTANTS.AugmentationCostMultiplier * BitNodeMultipliers.AugmentationMoneyCost;
if (augmentationExists(AugmentationNames.NeuroFluxGovernor)) { if (augmentationExists(AugmentationNames.NeuroFluxGovernor)) {
@ -1046,7 +1064,7 @@ function initAugmentations() {
NeuroFluxGovernor.addToAllFactions(); NeuroFluxGovernor.addToAllFactions();
AddToAugmentations(NeuroFluxGovernor); AddToAugmentations(NeuroFluxGovernor);
var Neurotrainer1 = new Augmentation({ const Neurotrainer1 = new Augmentation({
name:AugmentationNames.Neurotrainer1, repCost:400, moneyCost:800e3, name:AugmentationNames.Neurotrainer1, repCost:400, moneyCost:800e3,
info:"A decentralized cranial implant that improves the brain's ability to learn. It is " + 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 " + "installed by releasing millions of nanobots into the human brain, each of which " +
@ -1066,7 +1084,7 @@ function initAugmentations() {
} }
AddToAugmentations(Neurotrainer1); AddToAugmentations(Neurotrainer1);
var Neurotrainer2 = new Augmentation({ const Neurotrainer2 = new Augmentation({
name:AugmentationNames.Neurotrainer2, repCost:4e3, moneyCost:9e6, name:AugmentationNames.Neurotrainer2, repCost:4e3, moneyCost:9e6,
info:"A decentralized cranial implant that improves the brain's ability to learn. This " + 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 " + "is a more powerful version of the Neurotrainer I augmentation, but it does not " +
@ -1085,7 +1103,7 @@ function initAugmentations() {
} }
AddToAugmentations(Neurotrainer2); AddToAugmentations(Neurotrainer2);
var Neurotrainer3 = new Augmentation({ const Neurotrainer3 = new Augmentation({
name:AugmentationNames.Neurotrainer3, repCost:10e3, moneyCost:26e6, name:AugmentationNames.Neurotrainer3, repCost:10e3, moneyCost:26e6,
info:"A decentralized cranial implant that improves the brain's ability to learn. This " + 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, " + "is a more powerful version of the Neurotrainer I and Neurotrainer II augmentation, " +
@ -1104,7 +1122,7 @@ function initAugmentations() {
} }
AddToAugmentations(Neurotrainer3); AddToAugmentations(Neurotrainer3);
var Hypersight = new Augmentation({ const Hypersight = new Augmentation({
name:AugmentationNames.Hypersight, repCost:60e3, moneyCost:550e6, name:AugmentationNames.Hypersight, repCost:60e3, moneyCost:550e6,
info:"A bionic eye implant that grants sight capabilities far beyond those of a natural human. " + 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 " + "Embedded circuitry within the implant provides the ability to detect heat and movement " +
@ -1123,7 +1141,7 @@ function initAugmentations() {
} }
AddToAugmentations(Hypersight); AddToAugmentations(Hypersight);
var LuminCloaking1 = new Augmentation({ const LuminCloaking1 = new Augmentation({
name:AugmentationNames.LuminCloaking1, repCost:600, moneyCost:1e6, name:AugmentationNames.LuminCloaking1, repCost:600, moneyCost:1e6,
info:"A skin implant that reinforces the skin with highly-advanced synthetic cells. These " + 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 " + "cells, when powered, have a negative refractive index. As a result, they bend light " +
@ -1140,7 +1158,7 @@ function initAugmentations() {
} }
AddToAugmentations(LuminCloaking1); AddToAugmentations(LuminCloaking1);
var LuminCloaking2 = new Augmentation({ const LuminCloaking2 = new Augmentation({
name:AugmentationNames.LuminCloaking2, repCost:2e3, moneyCost:6e6, name:AugmentationNames.LuminCloaking2, repCost:2e3, moneyCost:6e6,
info:"This is a more advanced version of the LuminCloaking-V2 augmentation. This skin implant " + info:"This is a more advanced version of the LuminCloaking-V2 augmentation. This skin implant " +
"reinforces the skin with highly-advanced synthetic cells. These " + "reinforces the skin with highly-advanced synthetic cells. These " +
@ -1161,7 +1179,7 @@ function initAugmentations() {
} }
AddToAugmentations(LuminCloaking2); AddToAugmentations(LuminCloaking2);
var SmartSonar = new Augmentation({ const SmartSonar = new Augmentation({
name:AugmentationNames.SmartSonar, repCost:9e3, moneyCost:15e6, name:AugmentationNames.SmartSonar, repCost:9e3, moneyCost:15e6,
info:"A cochlear implant that helps the player detect and locate enemies " + info:"A cochlear implant that helps the player detect and locate enemies " +
"using sound propagation.<br><br>" + "using sound propagation.<br><br>" +
@ -1179,7 +1197,7 @@ function initAugmentations() {
} }
AddToAugmentations(SmartSonar); AddToAugmentations(SmartSonar);
var PowerRecirculator = new Augmentation({ const PowerRecirculator = new Augmentation({
name:AugmentationNames.PowerRecirculator, repCost:10e3, moneyCost:36e6, name:AugmentationNames.PowerRecirculator, repCost:10e3, moneyCost:36e6,
info:"The body's nerves are attached with polypyrrole nanocircuits that " + 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) " +
@ -1212,7 +1230,7 @@ function initAugmentations() {
// Silhouette // Silhouette
// Illuminati // Illuminati
var QLink = new Augmentation({ const QLink = new Augmentation({
name:AugmentationNames.QLink, repCost:750e3, moneyCost:5e12, name:AugmentationNames.QLink, repCost:750e3, moneyCost:5e12,
info:"A brain implant that wirelessly connects you to the Illuminati's " + info:"A brain implant that wirelessly connects you to the Illuminati's " +
"quantum supercomputer, allowing you to access and use its incredible " + "quantum supercomputer, allowing you to access and use its incredible " +
@ -1234,7 +1252,7 @@ function initAugmentations() {
AddToAugmentations(QLink); AddToAugmentations(QLink);
// Daedalus // Daedalus
var RedPill = new Augmentation({ const RedPill = new Augmentation({
name:AugmentationNames.TheRedPill, repCost:1e6, moneyCost:0, name:AugmentationNames.TheRedPill, repCost:1e6, moneyCost:0,
info:"It's time to leave the cave." info:"It's time to leave the cave."
}); });
@ -1245,7 +1263,7 @@ function initAugmentations() {
AddToAugmentations(RedPill); AddToAugmentations(RedPill);
// Covenant // Covenant
var SPTN97 = new Augmentation({ const SPTN97 = new Augmentation({
name:AugmentationNames.SPTN97, repCost:500e3, moneyCost:975e6, name:AugmentationNames.SPTN97, repCost:500e3, moneyCost:975e6,
info:"The SPTN-97 gene is injected into the genome. The SPTN-97 gene is an " + 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 " + "artificially-synthesized gene that was developed by DARPA to create " +
@ -1267,7 +1285,7 @@ function initAugmentations() {
AddToAugmentations(SPTN97); AddToAugmentations(SPTN97);
// ECorp // ECorp
var HiveMind = new Augmentation({ const HiveMind = new Augmentation({
name:AugmentationNames.HiveMind, repCost:600e3, moneyCost:1100e6, name:AugmentationNames.HiveMind, repCost:600e3, moneyCost:1100e6,
info:"A brain implant developed by ECorp. They do not reveal what " + info:"A brain implant developed by ECorp. They do not reveal what " +
"exactly the implant does, but they promise that it will greatly " + "exactly the implant does, but they promise that it will greatly " +
@ -1281,7 +1299,7 @@ function initAugmentations() {
AddToAugmentations(HiveMind); AddToAugmentations(HiveMind);
// MegaCorp // MegaCorp
var CordiARCReactor = new Augmentation({ const CordiARCReactor = new Augmentation({
name:AugmentationNames.CordiARCReactor, repCost:450e3, moneyCost:1000e6, name:AugmentationNames.CordiARCReactor, repCost:450e3, moneyCost:1000e6,
info:"The thoracic cavity is equipped with a small chamber designed " + info:"The thoracic cavity is equipped with a small chamber designed " +
"to hold and sustain hydrogen plasma. The plasma is used to generate " + "to hold and sustain hydrogen plasma. The plasma is used to generate " +
@ -1306,7 +1324,7 @@ function initAugmentations() {
AddToAugmentations(CordiARCReactor); AddToAugmentations(CordiARCReactor);
// BachmanAndAssociates // BachmanAndAssociates
var SmartJaw = new Augmentation({ const SmartJaw = new Augmentation({
name:AugmentationNames.SmartJaw, repCost:150e3, moneyCost:550e6, name:AugmentationNames.SmartJaw, repCost:150e3, moneyCost:550e6,
info:"A bionic jaw that contains advanced hardware and software " + info:"A bionic jaw that contains advanced hardware and software " +
"capable of psychoanalyzing and profiling the personality of " + "capable of psychoanalyzing and profiling the personality of " +
@ -1328,7 +1346,7 @@ function initAugmentations() {
AddToAugmentations(SmartJaw); AddToAugmentations(SmartJaw);
// BladeIndustries // BladeIndustries
var Neotra = new Augmentation({ const Neotra = new Augmentation({
name:AugmentationNames.Neotra, repCost:225e3, moneyCost:575e6, name:AugmentationNames.Neotra, repCost:225e3, moneyCost:575e6,
info:"A highly-advanced techno-organic drug that is injected into the skeletal " + info:"A highly-advanced techno-organic drug that is injected into the skeletal " +
"and integumentary system. The drug permanently modifies the DNA of the " + "and integumentary system. The drug permanently modifies the DNA of the " +
@ -1345,7 +1363,7 @@ function initAugmentations() {
AddToAugmentations(Neotra); AddToAugmentations(Neotra);
// NWO // NWO
var Xanipher = new Augmentation({ const Xanipher = new Augmentation({
name:AugmentationNames.Xanipher, repCost:350e3, moneyCost:850e6, name:AugmentationNames.Xanipher, repCost:350e3, moneyCost:850e6,
info:"A concoction of advanced nanobots that is orally ingested into the " + 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 change and significantly " +
@ -1373,7 +1391,7 @@ function initAugmentations() {
AddToAugmentations(Xanipher); AddToAugmentations(Xanipher);
// ClarkeIncorporated // ClarkeIncorporated
var nextSENS = new Augmentation({ const nextSENS = new Augmentation({
name:AugmentationNames.nextSENS, repCost:175e3, moneyCost:385e6, name:AugmentationNames.nextSENS, repCost:175e3, moneyCost:385e6,
info:"The body is genetically re-engineered to maintain a state " + info:"The body is genetically re-engineered to maintain a state " +
"of negligible senescence, preventing the body from " + "of negligible senescence, preventing the body from " +
@ -1393,7 +1411,7 @@ function initAugmentations() {
AddToAugmentations(nextSENS); AddToAugmentations(nextSENS);
// OmniTekIncorporated // OmniTekIncorporated
var OmniTekInfoLoad = new Augmentation({ const OmniTekInfoLoad = new Augmentation({
name:AugmentationNames.OmniTekInfoLoad, repCost:250e3, moneyCost:575e6, name:AugmentationNames.OmniTekInfoLoad, repCost:250e3, moneyCost:575e6,
info:"OmniTek's data and information repository is uploaded " + info:"OmniTek's data and information repository is uploaded " +
"into your brain, enhancing your programming and " + "into your brain, enhancing your programming and " +
@ -1414,7 +1432,7 @@ function initAugmentations() {
// TODO Later when Intelligence is added in . Some aug that greatly increases int // TODO Later when Intelligence is added in . Some aug that greatly increases int
// KuaiGongInternational // KuaiGongInternational
var PhotosyntheticCells = new Augmentation({ const PhotosyntheticCells = new Augmentation({
name:AugmentationNames.PhotosyntheticCells, repCost:225e3, moneyCost:550e6, name:AugmentationNames.PhotosyntheticCells, repCost:225e3, moneyCost:550e6,
info:"Chloroplasts are added to epidermal stem cells and are applied " + info:"Chloroplasts are added to epidermal stem cells and are applied " +
"to the body using a skin graft. The result is photosynthetic " + "to the body using a skin graft. The result is photosynthetic " +
@ -1432,7 +1450,7 @@ function initAugmentations() {
AddToAugmentations(PhotosyntheticCells); AddToAugmentations(PhotosyntheticCells);
// BitRunners // BitRunners
var Neurolink = new Augmentation({ const Neurolink = new Augmentation({
name:AugmentationNames.Neurolink, repCost:350e3, moneyCost:875e6, name:AugmentationNames.Neurolink, repCost:350e3, moneyCost:875e6,
info:"A brain implant that provides a high-bandwidth, direct neural link between your " + info:"A brain implant that provides a high-bandwidth, direct neural link between your " +
"mind and BitRunners' data servers, which reportedly contain " + "mind and BitRunners' data servers, which reportedly contain " +
@ -1455,7 +1473,7 @@ function initAugmentations() {
AddToAugmentations(Neurolink); AddToAugmentations(Neurolink);
// BlackHand // BlackHand
var TheBlackHand = new Augmentation({ const TheBlackHand = new Augmentation({
name:AugmentationNames.TheBlackHand, repCost:40e3, moneyCost:110e6, name:AugmentationNames.TheBlackHand, repCost:40e3, moneyCost:110e6,
info:"A highly advanced bionic hand. This prosthetic not only " + info:"A highly advanced bionic hand. This prosthetic not only " +
"enhances strength and dexterity but it is also embedded " + "enhances strength and dexterity but it is also embedded " +
@ -1479,7 +1497,7 @@ function initAugmentations() {
AddToAugmentations(TheBlackHand); AddToAugmentations(TheBlackHand);
// NiteSec // NiteSec
var CRTX42AA = new Augmentation({ const CRTX42AA = new Augmentation({
name:AugmentationNames.CRTX42AA, repCost:18e3, moneyCost:45e6, name:AugmentationNames.CRTX42AA, repCost:18e3, moneyCost:45e6,
info:"The CRTX42-AA gene is injected into the genome. " + info:"The CRTX42-AA gene is injected into the genome. " +
"The CRTX42-AA is an artificially-synthesized gene that targets the visual and prefrontal " + "The CRTX42-AA is an artificially-synthesized gene that targets the visual and prefrontal " +
@ -1497,7 +1515,7 @@ function initAugmentations() {
AddToAugmentations(CRTX42AA); AddToAugmentations(CRTX42AA);
// Chongqing // Chongqing
var Neuregen = new Augmentation({ const Neuregen = new Augmentation({
name:AugmentationNames.Neuregen, repCost:15e3, moneyCost:75e6, name:AugmentationNames.Neuregen, repCost:15e3, moneyCost:75e6,
info:"A drug that genetically modifies the neurons in the brain. " + info:"A drug that genetically modifies the neurons in the brain. " +
"The result is that these neurons never die and continuously " + "The result is that these neurons never die and continuously " +
@ -1512,7 +1530,7 @@ function initAugmentations() {
AddToAugmentations(Neuregen); AddToAugmentations(Neuregen);
// Sector12 // Sector12
var CashRoot = new Augmentation({ const CashRoot = new Augmentation({
name:AugmentationNames.CashRoot, repCost:5e3, moneyCost:25e6, name:AugmentationNames.CashRoot, repCost:5e3, moneyCost:25e6,
info:"A collection of digital assets saved on a small chip. The chip is implanted " + 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 " + "into your wrist. A small jack in the chip allows you to connect it to a computer " +
@ -1528,7 +1546,7 @@ function initAugmentations() {
AddToAugmentations(CashRoot); AddToAugmentations(CashRoot);
// NewTokyo // NewTokyo
var NutriGen = new Augmentation({ const NutriGen = new Augmentation({
name:AugmentationNames.NutriGen, repCost:2500, moneyCost:500e3, name:AugmentationNames.NutriGen, repCost:2500, moneyCost:500e3,
info:"A thermo-powered artificial nutrition generator. Endogenously " + info:"A thermo-powered artificial nutrition generator. Endogenously " +
"synthesizes glucose, amino acids, and vitamins and redistributes them " + "synthesizes glucose, amino acids, and vitamins and redistributes them " +
@ -1552,7 +1570,7 @@ function initAugmentations() {
// and profits as a trader/from trading // and profits as a trader/from trading
// Ishima // Ishima
var INFRARet = new Augmentation({ const INFRARet = new Augmentation({
name:AugmentationNames.INFRARet, repCost:3e3, moneyCost:6e6, name:AugmentationNames.INFRARet, repCost:3e3, moneyCost:6e6,
info:"A retina implant consisting of a tiny chip that sits behind the " + info:"A retina implant consisting of a tiny chip that sits behind the " +
"retina. This implant lets people visually detect infrared radiation.<br><br>" + "retina. This implant lets people visually detect infrared radiation.<br><br>" +
@ -1571,7 +1589,7 @@ function initAugmentations() {
AddToAugmentations(INFRARet); AddToAugmentations(INFRARet);
// Volhaven // Volhaven
var DermaForce = new Augmentation({ const DermaForce = new Augmentation({
name:AugmentationNames.DermaForce, repCost:6e3, moneyCost:10e6, name:AugmentationNames.DermaForce, repCost:6e3, moneyCost:10e6,
info:"A synthetic skin is grafted onto the body. The skin consists of " + info:"A synthetic skin is grafted onto the body. The skin consists of " +
"millions of nanobots capable of projecting high-density muon beams, " + "millions of nanobots capable of projecting high-density muon beams, " +
@ -1586,7 +1604,7 @@ function initAugmentations() {
AddToAugmentations(DermaForce); AddToAugmentations(DermaForce);
// SpeakersForTheDead // SpeakersForTheDead
var GrapheneBrachiBlades = new Augmentation({ const GrapheneBrachiBlades = new Augmentation({
name:AugmentationNames.GrapheneBrachiBlades, repCost:90e3, moneyCost:500e6, name:AugmentationNames.GrapheneBrachiBlades, repCost:90e3, moneyCost:500e6,
info:"An upgrade to the BrachiBlades augmentation. It infuses " + info:"An upgrade to the BrachiBlades augmentation. It infuses " +
"the retractable blades with an advanced graphene material " + "the retractable blades with an advanced graphene material " +
@ -1608,7 +1626,7 @@ function initAugmentations() {
AddToAugmentations(GrapheneBrachiBlades); AddToAugmentations(GrapheneBrachiBlades);
// DarkArmy // DarkArmy
var GrapheneBionicArms = new Augmentation({ const GrapheneBionicArms = new Augmentation({
name:AugmentationNames.GrapheneBionicArms, repCost:200e3, moneyCost:750e6, name:AugmentationNames.GrapheneBionicArms, repCost:200e3, moneyCost:750e6,
info:"An upgrade to the Bionic Arms augmentation. It infuses the " + info:"An upgrade to the Bionic Arms augmentation. It infuses the " +
"prosthetic arms with an advanced graphene material " + "prosthetic arms with an advanced graphene material " +
@ -1625,7 +1643,7 @@ function initAugmentations() {
AddToAugmentations(GrapheneBionicArms); AddToAugmentations(GrapheneBionicArms);
// TheSyndicate // TheSyndicate
var BrachiBlades = new Augmentation({ const BrachiBlades = new Augmentation({
name:AugmentationNames.BrachiBlades, repCost:5e3, moneyCost:18e6, name:AugmentationNames.BrachiBlades, repCost:5e3, moneyCost:18e6,
info:"A set of retractable plasteel blades are implanted in the arm, underneath the skin.<br><br>" + info:"A set of retractable plasteel blades are implanted in the arm, underneath the skin.<br><br>" +
"This augmentation:<br>" + "This augmentation:<br>" +
@ -1644,7 +1662,7 @@ function initAugmentations() {
AddToAugmentations(BrachiBlades); AddToAugmentations(BrachiBlades);
// Tetrads // Tetrads
var BionicArms = new Augmentation({ const BionicArms = new Augmentation({
name:AugmentationNames.BionicArms, repCost:25e3, moneyCost:55e6, name:AugmentationNames.BionicArms, repCost:25e3, moneyCost:55e6,
info:"Cybernetic arms created from plasteel and carbon fibers that completely replace " + info:"Cybernetic arms created from plasteel and carbon fibers that completely replace " +
"the user's organic arms.<br><br>" + "the user's organic arms.<br><br>" +
@ -1659,7 +1677,7 @@ function initAugmentations() {
AddToAugmentations(BionicArms); AddToAugmentations(BionicArms);
// TianDiHui // TianDiHui
var SNA = new Augmentation({ const SNA = new Augmentation({
name:AugmentationNames.SNA, repCost:2500, moneyCost:6e6, name:AugmentationNames.SNA, repCost:2500, moneyCost:6e6,
info:"A cranial implant that affects the user's personality, making them better " + info:"A cranial implant that affects the user's personality, making them better " +
"at negotiation in social situations.<br><br>" + "at negotiation in social situations.<br><br>" +
@ -1678,9 +1696,9 @@ function initAugmentations() {
AddToAugmentations(SNA); AddToAugmentations(SNA);
// Special Bladeburner Augmentations // Special Bladeburner Augmentations
var BladeburnersFactionName = "Bladeburners"; const BladeburnersFactionName = "Bladeburners";
if (factionExists(BladeburnersFactionName)) { if (factionExists(BladeburnersFactionName)) {
var EsperEyewear = new Augmentation({ const EsperEyewear = new Augmentation({
name:AugmentationNames.EsperEyewear, repCost:500, moneyCost:33e6, name:AugmentationNames.EsperEyewear, repCost:500, moneyCost:33e6,
info:"Ballistic-grade protective and retractable eyewear that was designed specially " + info:"Ballistic-grade protective and retractable eyewear that was designed specially " +
"for Bladeburner units. This " + "for Bladeburner units. This " +
@ -1700,7 +1718,7 @@ function initAugmentations() {
EsperEyewear.addToFactions([BladeburnersFactionName]); EsperEyewear.addToFactions([BladeburnersFactionName]);
resetAugmentation(EsperEyewear); resetAugmentation(EsperEyewear);
var EMS4Recombination = new Augmentation({ const EMS4Recombination = new Augmentation({
name:AugmentationNames.EMS4Recombination, repCost: 1e3, moneyCost:55e6, name:AugmentationNames.EMS4Recombination, repCost: 1e3, moneyCost:55e6,
info:"A DNA recombination of the EMS-4 Gene. This genetic engineering " + info:"A DNA recombination of the EMS-4 Gene. This genetic engineering " +
"technique was originally used on Bladeburners during the Synthoid uprising " + "technique was originally used on Bladeburners during the Synthoid uprising " +
@ -1718,7 +1736,7 @@ function initAugmentations() {
EMS4Recombination.addToFactions([BladeburnersFactionName]); EMS4Recombination.addToFactions([BladeburnersFactionName]);
resetAugmentation(EMS4Recombination); resetAugmentation(EMS4Recombination);
var OrionShoulder = new Augmentation({ const OrionShoulder = new Augmentation({
name:AugmentationNames.OrionShoulder, repCost:2.5e3, moneyCost:110e6, name:AugmentationNames.OrionShoulder, repCost:2.5e3, moneyCost:110e6,
info:"A bionic shoulder augmentation for the right shoulder. Using cybernetics, " + info:"A bionic shoulder augmentation for the right shoulder. Using cybernetics, " +
"the ORION-MKIV shoulder enhances the strength and dexterity " + "the ORION-MKIV shoulder enhances the strength and dexterity " +
@ -1737,7 +1755,7 @@ function initAugmentations() {
OrionShoulder.addToFactions([BladeburnersFactionName]); OrionShoulder.addToFactions([BladeburnersFactionName]);
resetAugmentation(OrionShoulder); resetAugmentation(OrionShoulder);
var HyperionV1 = new Augmentation({ const HyperionV1 = new Augmentation({
name:AugmentationNames.HyperionV1, repCost: 5e3, moneyCost:550e6, name:AugmentationNames.HyperionV1, repCost: 5e3, moneyCost:550e6,
info:"A pair of mini plasma cannons embedded into the hands. The Hyperion is capable " + 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 " + "of rapidly firing bolts of high-density plasma. The weapon is meant to " +
@ -1753,7 +1771,7 @@ function initAugmentations() {
HyperionV1.addToFactions([BladeburnersFactionName]); HyperionV1.addToFactions([BladeburnersFactionName]);
resetAugmentation(HyperionV1); resetAugmentation(HyperionV1);
var HyperionV2 = new Augmentation({ const HyperionV2 = new Augmentation({
name:AugmentationNames.HyperionV2, repCost:10e3, moneyCost:1.1e9, name:AugmentationNames.HyperionV2, repCost:10e3, moneyCost:1.1e9,
info:"A pair of mini plasma cannons embedded into the hands. This augmentation " + 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 " + "is more advanced and powerful than the original V1 model. This V2 model is " +
@ -1768,7 +1786,7 @@ function initAugmentations() {
HyperionV2.addToFactions([BladeburnersFactionName]); HyperionV2.addToFactions([BladeburnersFactionName]);
resetAugmentation(HyperionV2); resetAugmentation(HyperionV2);
var GolemSerum = new Augmentation({ const GolemSerum = new Augmentation({
name:AugmentationNames.GolemSerum, repCost:12.5e3, moneyCost:2.2e9, name:AugmentationNames.GolemSerum, repCost:12.5e3, moneyCost:2.2e9,
info:"A serum that permanently enhances many aspects of a human's capabilities, " + info:"A serum that permanently enhances many aspects of a human's capabilities, " +
"including strength, speed, immune system performance, and mitochondrial efficiency. The " + "including strength, speed, immune system performance, and mitochondrial efficiency. The " +
@ -1787,7 +1805,7 @@ function initAugmentations() {
GolemSerum.addToFactions([BladeburnersFactionName]); GolemSerum.addToFactions([BladeburnersFactionName]);
resetAugmentation(GolemSerum); resetAugmentation(GolemSerum);
var VangelisVirus = new Augmentation({ const VangelisVirus = new Augmentation({
name:AugmentationNames.VangelisVirus, repCost:7.5e3, moneyCost:550e6, name:AugmentationNames.VangelisVirus, repCost:7.5e3, moneyCost:550e6,
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 the human brain tissue. The Vangelis virus " +
"heightens the senses and focus of its host, and also enhances its intuition.<br><br>" + "heightens the senses and focus of its host, and also enhances its intuition.<br><br>" +
@ -1803,7 +1821,7 @@ function initAugmentations() {
VangelisVirus.addToFactions([BladeburnersFactionName]); VangelisVirus.addToFactions([BladeburnersFactionName]);
resetAugmentation(VangelisVirus); resetAugmentation(VangelisVirus);
var VangelisVirus3 = new Augmentation({ const VangelisVirus3 = new Augmentation({
name:AugmentationNames.VangelisVirus3, repCost:15e3, moneyCost:2.2e9, name:AugmentationNames.VangelisVirus3, repCost:15e3, moneyCost:2.2e9,
info:"An improved version of Vangelis, a synthetic symbiotic virus that is " + 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 the human brain tissue. On top of the benefits of the original " +
@ -1823,7 +1841,7 @@ function initAugmentations() {
VangelisVirus3.addToFactions([BladeburnersFactionName]); VangelisVirus3.addToFactions([BladeburnersFactionName]);
resetAugmentation(VangelisVirus3); resetAugmentation(VangelisVirus3);
var INTERLINKED = new Augmentation({ const INTERLINKED = new Augmentation({
name:AugmentationNames.INTERLINKED, repCost:10e3, moneyCost:1.1e9, name:AugmentationNames.INTERLINKED, repCost:10e3, moneyCost:1.1e9,
info:"The DNA is genetically modified to enhance the human's body " + info:"The DNA is genetically modified to enhance the human's body " +
"extracellular matrix (ECM). This improves the ECM's ability to " + "extracellular matrix (ECM). This improves the ECM's ability to " +
@ -1842,7 +1860,7 @@ function initAugmentations() {
INTERLINKED.addToFactions([BladeburnersFactionName]); INTERLINKED.addToFactions([BladeburnersFactionName]);
resetAugmentation(INTERLINKED); resetAugmentation(INTERLINKED);
var BladeRunner = new Augmentation({ const BladeRunner = new Augmentation({
name:AugmentationNames.BladeRunner, repCost:8e3, moneyCost:1.65e9, name:AugmentationNames.BladeRunner, repCost:8e3, moneyCost:1.65e9,
info:"A cybernetic foot augmentation that was specially created for Bladeburners " + info:"A cybernetic foot augmentation that was specially created for Bladeburners " +
"during the Synthoid Uprising. The organic musculature of the human foot " + "during the Synthoid Uprising. The organic musculature of the human foot " +
@ -1860,7 +1878,7 @@ function initAugmentations() {
BladeRunner.addToFactions([BladeburnersFactionName]); BladeRunner.addToFactions([BladeburnersFactionName]);
resetAugmentation(BladeRunner); resetAugmentation(BladeRunner);
var BladeArmor = new Augmentation({ const BladeArmor = new Augmentation({
name:AugmentationNames.BladeArmor, repCost:5e3, moneyCost:275e6, name:AugmentationNames.BladeArmor, repCost:5e3, moneyCost:275e6,
info:"A powered exoskeleton suit (exosuit) designed as armor for Bladeburner units. This " + 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, " + "exoskeleton is incredibly adaptable and can protect the wearer from blunt, piercing, " +
@ -1881,7 +1899,7 @@ function initAugmentations() {
BladeArmor.addToFactions([BladeburnersFactionName]); BladeArmor.addToFactions([BladeburnersFactionName]);
resetAugmentation(BladeArmor); resetAugmentation(BladeArmor);
var BladeArmorPowerCells = new Augmentation({ const BladeArmorPowerCells = new Augmentation({
name:AugmentationNames.BladeArmorPowerCells, repCost:7.5e3, moneyCost:550e6, name:AugmentationNames.BladeArmorPowerCells, repCost:7.5e3, moneyCost:550e6,
info:"Upgrades the BLADE-51b Tesla Armor with Ion Power Cells, which are capable of " + info:"Upgrades the BLADE-51b Tesla Armor with Ion Power Cells, which are capable of " +
"more efficiently storing and using power.<br><br>" + "more efficiently storing and using power.<br><br>" +
@ -1898,7 +1916,7 @@ function initAugmentations() {
BladeArmorPowerCells.addToFactions([BladeburnersFactionName]); BladeArmorPowerCells.addToFactions([BladeburnersFactionName]);
resetAugmentation(BladeArmorPowerCells); resetAugmentation(BladeArmorPowerCells);
var BladeArmorEnergyShielding = new Augmentation({ const BladeArmorEnergyShielding = new Augmentation({
name:AugmentationNames.BladeArmorEnergyShielding, repCost:8.5e3, moneyCost:1.1e9, name:AugmentationNames.BladeArmorEnergyShielding, repCost:8.5e3, moneyCost:1.1e9,
info:"Upgrades the BLADE-51b Tesla Armor with a plasma energy propulsion system " + info:"Upgrades the BLADE-51b Tesla Armor with a plasma energy propulsion system " +
"that is capable of projecting an energy shielding force field.<br><br>" + "that is capable of projecting an energy shielding force field.<br><br>" +
@ -1913,7 +1931,7 @@ function initAugmentations() {
BladeArmorEnergyShielding.addToFactions([BladeburnersFactionName]); BladeArmorEnergyShielding.addToFactions([BladeburnersFactionName]);
resetAugmentation(BladeArmorEnergyShielding); resetAugmentation(BladeArmorEnergyShielding);
var BladeArmorUnibeam = new Augmentation({ const BladeArmorUnibeam = new Augmentation({
name:AugmentationNames.BladeArmorUnibeam, repCost:12.5e3, moneyCost:3.3e9, name:AugmentationNames.BladeArmorUnibeam, repCost:12.5e3, moneyCost:3.3e9,
info:"Upgrades the BLADE-51b Tesla Armor with a concentrated deuterium-fluoride laser " + 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 an accuracy makes it useful for quickly neutralizing " +
@ -1927,7 +1945,7 @@ function initAugmentations() {
BladeArmorUnibeam.addToFactions([BladeburnersFactionName]); BladeArmorUnibeam.addToFactions([BladeburnersFactionName]);
resetAugmentation(BladeArmorUnibeam); resetAugmentation(BladeArmorUnibeam);
var BladeArmorOmnibeam = new Augmentation({ const BladeArmorOmnibeam = new Augmentation({
name:AugmentationNames.BladeArmorOmnibeam, repCost:25e3, moneyCost:5.5e9, name:AugmentationNames.BladeArmorOmnibeam, repCost:25e3, moneyCost:5.5e9,
info:"Upgrades the BLADE-51b Tesla Armor Unibeam augmentation to use " + info:"Upgrades the BLADE-51b Tesla Armor Unibeam augmentation to use " +
"multiple-fiber system. The upgraded weapon uses multiple fiber laser " + "multiple-fiber system. The upgraded weapon uses multiple fiber laser " +
@ -1942,7 +1960,7 @@ function initAugmentations() {
BladeArmorOmnibeam.addToFactions([BladeburnersFactionName]); BladeArmorOmnibeam.addToFactions([BladeburnersFactionName]);
resetAugmentation(BladeArmorOmnibeam); resetAugmentation(BladeArmorOmnibeam);
var BladeArmorIPU = new Augmentation({ const BladeArmorIPU = new Augmentation({
name:AugmentationNames.BladeArmorIPU, repCost: 6e3, moneyCost:220e6, name:AugmentationNames.BladeArmorIPU, repCost: 6e3, moneyCost:220e6,
info:"Upgrades the BLADE-51b Tesla Armor with an AI Information Processing " + info:"Upgrades the BLADE-51b Tesla Armor with an AI Information Processing " +
"Unit that was specially designed to analyze Synthoid related data and " + "Unit that was specially designed to analyze Synthoid related data and " +
@ -1958,7 +1976,7 @@ function initAugmentations() {
BladeArmorIPU.addToFactions([BladeburnersFactionName]); BladeArmorIPU.addToFactions([BladeburnersFactionName]);
resetAugmentation(BladeArmorIPU); resetAugmentation(BladeArmorIPU);
var BladesSimulacrum = new Augmentation({ const BladesSimulacrum = new Augmentation({
name:AugmentationNames.BladesSimulacrum, repCost: 500, moneyCost: 30e9, name:AugmentationNames.BladesSimulacrum, repCost: 500, moneyCost: 30e9,
info:"A highly-advanced matter phase-shifter module that is embedded " + info:"A highly-advanced matter phase-shifter module that is embedded " +
"in the brainstem and cerebellum. This augmentation allows " + "in the brainstem and cerebellum. This augmentation allows " +
@ -1974,7 +1992,7 @@ function initAugmentations() {
} }
// Update costs based on how many have been purchased // Update costs based on how many have been purchased
var mult = Math.pow(CONSTANTS.MultipleAugMultiplier, Player.queuedAugmentations.length); mult = Math.pow(CONSTANTS.MultipleAugMultiplier, Player.queuedAugmentations.length);
for (var name in Augmentations) { for (var name in Augmentations) {
if (Augmentations.hasOwnProperty(name)) { if (Augmentations.hasOwnProperty(name)) {
Augmentations[name].baseCost *= mult; Augmentations[name].baseCost *= mult;
@ -2014,15 +2032,17 @@ function applyAugmentation(aug, reapply=false) {
if (aug.name === AugmentationNames.NeuroFluxGovernor) { if (aug.name === AugmentationNames.NeuroFluxGovernor) {
if (!reapply) { if (!reapply) {
Augmentations[aug.name].level = aug.level; Augmentations[aug.name].level = aug.level;
for (var i = 0; i < Player.augmentations.length; ++i) { for (let i = 0; i < Player.augmentations.length; ++i) {
if (Player.augmentations[i].name == AugmentationNames.NeuroFluxGovernor) { if (Player.augmentations[i].name == AugmentationNames.NeuroFluxGovernor) {
Player.augmentations[i].level = aug.level; Player.augmentations[i].level = aug.level;
break; return;
// break;
} }
} }
} }
} }
/*
if (aug.name === AugmentationNames.NeuroFluxGovernor) { if (aug.name === AugmentationNames.NeuroFluxGovernor) {
for (var i = 0; i < Player.augmentations.length; ++i) { for (var i = 0; i < Player.augmentations.length; ++i) {
if (Player.augmentations[i].name == AugmentationNames.NeuroFluxGovernor) { if (Player.augmentations[i].name == AugmentationNames.NeuroFluxGovernor) {
@ -2031,6 +2051,7 @@ function applyAugmentation(aug, reapply=false) {
} }
} }
} }
*/
// Push onto Player's Augmentation list // Push onto Player's Augmentation list
if (!reapply) { if (!reapply) {

@ -49,6 +49,7 @@ export let AugmentationNames: IMap<string> = {
PCDNINeuralNetwork: "PC Direct-Neural Interface NeuroNet Injector", PCDNINeuralNetwork: "PC Direct-Neural Interface NeuroNet Injector",
ADRPheromone1: "ADR-V1 Pheromone Gene", ADRPheromone1: "ADR-V1 Pheromone Gene",
ADRPheromone2: "ADR-V2 Pheromone Gene", ADRPheromone2: "ADR-V2 Pheromone Gene",
ShadowsSimulacrum: "The Shadow's Simulacrum",
HacknetNodeCPUUpload: "Hacknet Node CPU Architecture Neural-Upload", HacknetNodeCPUUpload: "Hacknet Node CPU Architecture Neural-Upload",
HacknetNodeCacheUpload: "Hacknet Node Cache Architecture Neural-Upload", HacknetNodeCacheUpload: "Hacknet Node Cache Architecture Neural-Upload",
HacknetNodeNICUpload: "Hacknet Node NIC Architecture Neural-Upload", HacknetNodeNICUpload: "Hacknet Node NIC Architecture Neural-Upload",

@ -6,7 +6,7 @@
import { IMap } from "./types"; import { IMap } from "./types";
export let CONSTANTS: IMap<any> = { export let CONSTANTS: IMap<any> = {
Version: "0.46.2", Version: "0.46.3",
/** Max level for any skill, assuming no multipliers. Determined by max numerical value in javascript for experience /** Max level for any skill, assuming no multipliers. Determined by max numerical value in javascript for experience
* and the skill level formula in Player.js. Note that all this means it that when experience hits MAX_INT, then * and the skill level formula in Player.js. Note that all this means it that when experience hits MAX_INT, then
@ -275,6 +275,15 @@ export let CONSTANTS: IMap<any> = {
LatestUpdate: LatestUpdate:
` `
v0.46.3
* Added a new Augmentation: The Shadow's Simulacrum
* Improved tab autocompletion feature in Terminal so that it works better with directories
* Bug Fix: Tech vendor location UI now properly refreshed when purchasing a TOR router
* Bug Fix: Fixed UI issue with faction donations
* Bug Fix: The money statistics & breakdown should now properly track money earned from Hacknet Server (hashes -> money)
* Bug Fix: Fixed issue with changing input in 'Minimum Path Sum in a Triangle' coding contract problem
* Fixed several typos in various places
v0.46.2 v0.46.2
* Source-File 2 now allows you to form gangs in other BitNodes when your karma reaches a very large negative value * Source-File 2 now allows you to form gangs in other BitNodes when your karma reaches a very large negative value
** (Karma is a hidden stat and is lowered by committing crimes) ** (Karma is a hidden stat and is lowered by committing crimes)

@ -317,6 +317,7 @@ export function purchaseHashUpgrade(upgName, upgTarget) {
switch (upgName) { switch (upgName) {
case "Sell for Money": { case "Sell for Money": {
Player.gainMoney(upg.value); Player.gainMoney(upg.value);
Player.recordMoneySource(upg.value, "hacknetnode");
break; break;
} }
case "Sell for Corporation Funds": { case "Sell for Corporation Funds": {

@ -15,7 +15,7 @@ export class GeneralInfo extends React.Component {
`you hashes. Hashes can be spent on a variety of different upgrades.`; `you hashes. Hashes can be spent on a variety of different upgrades.`;
} else { } else {
return `Here, you can purchase a Hacknet Node, a specialized machine that can connect ` + return `Here, you can purchase a Hacknet Node, a specialized machine that can connect ` +
`and contribute its resources to the Hacknet networ. This allows you to take ` + `and contribute its resources to the Hacknet network. This allows you to take ` +
`a small percentage of profits from hacks performed on the network. Essentially, ` + `a small percentage of profits from hacks performed on the network. Essentially, ` +
`you are renting out your Node's computing power.`; `you are renting out your Node's computing power.`;
} }

@ -362,7 +362,7 @@ export class CompanyLocation extends React.Component<IProps, IState> {
<StdButton <StdButton
onClick={this.startInfiltration} onClick={this.startInfiltration}
style={this.btnStyle} style={this.btnStyle}
text={"Infiltration Company"} text={"Infiltrate Company"}
/> />
} }
</div> </div>

@ -4693,12 +4693,19 @@ function NetscriptFunctions(workerScript) {
} }
updateDynamicRam("joinBladeburnerDivision", CONSTANTS.ScriptBladeburnerApiBaseRamCost); updateDynamicRam("joinBladeburnerDivision", CONSTANTS.ScriptBladeburnerApiBaseRamCost);
if ((Player.bitNodeN === 7 || hasBladeburner2079SF)) { if ((Player.bitNodeN === 7 || hasBladeburner2079SF)) {
if (Player.bitNodeN === 8) { return false; }
if (Player.bladeburner instanceof Bladeburner) { if (Player.bladeburner instanceof Bladeburner) {
return true; // Already member return true; // Already member
} else if (Player.strength >= 100 && Player.defense >= 100 && } else if (Player.strength >= 100 && Player.defense >= 100 &&
Player.dexterity >= 100 && Player.agility >= 100) { Player.dexterity >= 100 && Player.agility >= 100) {
Player.bladeburner = new Bladeburner({new:true}); Player.bladeburner = new Bladeburner({new:true});
workerScript.log("You have been accepted into the Bladeburner division"); workerScript.log("You have been accepted into the Bladeburner division");
const worldHeader = document.getElementById("world-menu-header");
if (worldHeader instanceof HTMLElement) {
worldHeader.click(); worldHeader.click();
}
return true; return true;
} else { } else {
workerScript.log("You do not meet the requirements for joining the Bladeburner division"); workerScript.log("You do not meet the requirements for joining the Bladeburner division");

@ -69,10 +69,10 @@ export class CovenantSleeveMemoryUpgrade extends React.Component<IProps, IState>
const cost = this.getPurchaseCost(); const cost = this.getPurchaseCost();
const purchaseBtnDisabled = !this.props.p.canAfford(cost); const purchaseBtnDisabled = !this.props.p.canAfford(cost);
let purchaseBtnText; let purchaseBtnText;
if (this.state.amt > maxMemory) { if (isNaN(this.state.amt)) {
purchaseBtnText = `Memory cannot exceed 100`;
} else if (isNaN(this.state.amt)) {
purchaseBtnText = "Invalid value"; purchaseBtnText = "Invalid value";
} else if (this.state.amt > maxMemory) {
purchaseBtnText = `Memory cannot exceed 100`;
} else { } else {
purchaseBtnText = `Purchase ${this.state.amt} memory - ${numeralWrapper.formatMoney(cost)}`; purchaseBtnText = `Purchase ${this.state.amt} memory - ${numeralWrapper.formatMoney(cost)}`;
} }
@ -88,7 +88,7 @@ export class CovenantSleeveMemoryUpgrade extends React.Component<IProps, IState>
<label htmlFor={inputId}> <label htmlFor={inputId}>
Amount of memory to purchase (must be an integer): Amount of memory to purchase (must be an integer):
</label> </label>
<input id={inputId} onChange={this.changePurchaseAmount} type={"number"} value={this.state.amt} /> <input id={inputId} onChange={this.changePurchaseAmount} type={"number"} value={isNaN(this.state.amt) ? this.state.amt.toString() : this.state.amt} />
<br /> <br />
<StdButton disabled={purchaseBtnDisabled} onClick={this.purchaseMemory} text={purchaseBtnText} /> <StdButton disabled={purchaseBtnDisabled} onClick={this.purchaseMemory} text={purchaseBtnText} />
</div> </div>

@ -204,7 +204,7 @@ $(document).keydown(function(event) {
// Autocomplete // Autocomplete
if (terminalInput == null) {return;} if (terminalInput == null) {return;}
var input = terminalInput.value; let input = terminalInput.value;
if (input == "") { return; } if (input == "") { return; }
const semiColonIndex = input.lastIndexOf(";"); const semiColonIndex = input.lastIndexOf(";");
@ -215,14 +215,14 @@ $(document).keydown(function(event) {
input = input.trim(); input = input.trim();
input = input.replace(/\s\s+/g, ' '); input = input.replace(/\s\s+/g, ' ');
var commandArray = input.split(" "); const commandArray = input.split(" ");
var index = commandArray.length - 2; let index = commandArray.length - 2;
if (index < -1) { index = 0; } if (index < -1) { index = 0; }
var allPos = determineAllPossibilitiesForTabCompletion(Player, input, index); const allPos = determineAllPossibilitiesForTabCompletion(Player, input, index, Terminal.currDir);
if (allPos.length == 0) {return;} if (allPos.length == 0) {return;}
var arg = ""; let arg = "";
var command = ""; let command = "";
if (commandArray.length == 0) {return;} if (commandArray.length == 0) {return;}
if (commandArray.length == 1) {command = commandArray[0];} if (commandArray.length == 1) {command = commandArray[0];}
else if (commandArray.length == 2) { else if (commandArray.length == 2) {

@ -2,6 +2,8 @@
* Helper functions that implement "directory" functionality in the Terminal. * Helper functions that implement "directory" functionality in the Terminal.
* These aren't real directories, they're more of a pseudo-directory implementation * These aren't real directories, they're more of a pseudo-directory implementation
*/ */
import { HacknetServer } from "../Hacknet/HacknetServer";
import { Server } from "../Server/Server";
/** /**
* Removes leading forward slash ("/") from a string. * Removes leading forward slash ("/") from a string.
@ -115,7 +117,7 @@ export function isValidFilePath(path: string): boolean {
} }
/** /**
* Returns a formatter string for the first parent directory in a filepath. For example: * Returns a formatted string for the first parent directory in a filepath. For example:
* /home/var/test/ -> home/ * /home/var/test/ -> home/
* If there is no first parent directory, then it returns "/" for root * If there is no first parent directory, then it returns "/" for root
*/ */
@ -124,12 +126,67 @@ export function getFirstParentDirectory(path: string): string {
t_path = removeLeadingSlash(t_path); t_path = removeLeadingSlash(t_path);
t_path = removeTrailingSlash(t_path); t_path = removeTrailingSlash(t_path);
if (t_path.lastIndexOf("/") === -1) { return "/"; }
let dirs = t_path.split("/"); let dirs = t_path.split("/");
if (dirs.length === 0) { return "/"; } if (dirs.length === 0) { return "/"; }
return dirs[0] + "/"; return dirs[0] + "/";
} }
/**
* Given a filepath, returns a formatted string for all of the parent directories
* in that filepath. For example:
* /home/var/tes -> home/var/
* /home/var/test/ -> home/var/test/
* If there are no parent directories, it returns the empty string
*/
export function getAllParentDirectories(path: string): string {
let t_path = path;
const lastSlash = t_path.lastIndexOf("/");
if (lastSlash === -1) { return ""; }
return t_path.slice(0, lastSlash + 1);
}
/**
* Given a directory (by the full directory path) and a server, returns all
* subdirectories of that directory. This is only for FIRST-LEVEl/immediate subdirectories
*/
export function getSubdirectories(serv: Server | HacknetServer, dir: string): string[] {
const res: string[] = [];
if (!isValidDirectoryPath(dir)) { return res; }
let t_dir = dir;
if (!t_dir.endsWith("/")) { t_dir += "/"; }
function processFile(fn: string) {
if (t_dir === "/" && isInRootDirectory(fn)) {
const subdir = getFirstParentDirectory(fn);
if (subdir !== "/" && !res.includes(subdir)) {
res.push(subdir);
}
} else if (fn.startsWith(t_dir)) {
const remaining = fn.slice(t_dir.length);
const subdir = getFirstParentDirectory(remaining);
if (subdir !== "/" && !res.includes(subdir)) {
res.push(subdir);
}
}
}
for (const script of serv.scripts) {
processFile(script.filename);
}
for (const txt of serv.textFiles) {
processFile(txt.fn);
}
return res;
}
/** /**
* Checks if a file path refers to a file in the root directory. * Checks if a file path refers to a file in the root directory.
*/ */

@ -1,3 +1,9 @@
import {
evaluateDirectoryPath,
getAllParentDirectories,
getSubdirectories,
} from "./DirectoryHelpers";
import { import {
Aliases, Aliases,
GlobalAliases GlobalAliases
@ -44,12 +50,14 @@ const commands = [
"top" "top"
]; ];
export function determineAllPossibilitiesForTabCompletion(p: IPlayer, input: string, index: number=0): string[] { export function determineAllPossibilitiesForTabCompletion(p: IPlayer, input: string, index: number, currPath: string=""): string[] {
let allPos: string[] = []; let allPos: string[] = [];
allPos = allPos.concat(Object.keys(GlobalAliases)); allPos = allPos.concat(Object.keys(GlobalAliases));
const currServ = p.getCurrentServer(); const currServ = p.getCurrentServer();
const homeComputer = p.getHomeComputer(); const homeComputer = p.getHomeComputer();
input = input.toLowerCase();
let parentDirPath: string = "";
let evaledParentDirPath: string | null = null;
// Helper functions // Helper functions
function addAllCodingContracts() { function addAllCodingContracts() {
@ -82,15 +90,71 @@ export function determineAllPossibilitiesForTabCompletion(p: IPlayer, input: str
function addAllScripts() { function addAllScripts() {
for (const script of currServ.scripts) { for (const script of currServ.scripts) {
allPos.push(script.filename); const res = processFilepath(script.filename);
if (res) {
allPos.push(res);
}
} }
} }
function addAllTextFiles() { function addAllTextFiles() {
for (const txt of currServ.textFiles) { for (const txt of currServ.textFiles) {
allPos.push(txt.fn); const res = processFilepath(txt.fn);
if (res) {
allPos.push(res);
} }
} }
}
function addAllDirectories() {
// Directories are based on the currently evaluated path
const subdirs = getSubdirectories(currServ, evaledParentDirPath == null ? "/" : evaledParentDirPath);
for (let i = 0; i < subdirs.length; ++i) {
const assembledDirPath = (evaledParentDirPath == null ? subdirs[i] : evaledParentDirPath + subdirs[i]);
const res = processFilepath(assembledDirPath);
if (res != null) {
subdirs[i] = res;
}
}
allPos = allPos.concat(subdirs);
}
// Convert from the real absolute path back to the original path used in the input
function convertParentPath(filepath: string): string {
if (parentDirPath == null || evaledParentDirPath == null) {
console.warn(`convertParentPath() called when paths are null`);
return filepath;
}
if (!filepath.startsWith(evaledParentDirPath)) {
console.warn(`convertParentPath() called for invalid path. (filepath=${filepath}) (evaledParentDirPath=${evaledParentDirPath})`);
return filepath;
}
return parentDirPath + filepath.slice(evaledParentDirPath.length);
}
// Given an a full, absolute filepath, converts it to the proper value
// for autocompletion purposes
function processFilepath(filepath: string): string | null {
if (evaledParentDirPath) {
if (filepath.startsWith(evaledParentDirPath)) {
return convertParentPath(filepath);
}
} else if (parentDirPath !== "") {
// If the parent directory is the root directory, but we're not searching
// it from the root directory, we have to add the original path
let t_parentDirPath = parentDirPath;
if (!t_parentDirPath.endsWith("/")) { t_parentDirPath += "/"; }
return parentDirPath + filepath;
} else {
return filepath;
}
return null;
}
function isCommand(cmd: string) { function isCommand(cmd: string) {
let t_cmd = cmd; let t_cmd = cmd;
@ -120,10 +184,28 @@ export function determineAllPossibilitiesForTabCompletion(p: IPlayer, input: str
} }
// Autocomplete the command // Autocomplete the command
if (index == -1) { if (index === -1) {
return commands.concat(Object.keys(Aliases)).concat(Object.keys(GlobalAliases)); return commands.concat(Object.keys(Aliases)).concat(Object.keys(GlobalAliases));
} }
// Since we're autocompleting an argument and not a command, the argument might
// be a file/directory path. We have to account for that when autocompleting
const commandArray = input.split(" ");
if (commandArray.length === 0) {
console.warn(`Tab autocompletion logic reached invalid branch`);
return allPos;
}
const arg = commandArray[commandArray.length - 1];
parentDirPath = getAllParentDirectories(arg);
evaledParentDirPath = evaluateDirectoryPath(parentDirPath, currPath);
if (evaledParentDirPath === "/") {
evaledParentDirPath = null;
} else if (evaledParentDirPath == null) {
return allPos; // Invalid path
} else {
evaledParentDirPath += "/";
}
if (isCommand("buy")) { if (isCommand("buy")) {
let options = []; let options = [];
for (const i in DarkWebItems) { for (const i in DarkWebItems) {
@ -147,6 +229,7 @@ export function determineAllPossibilitiesForTabCompletion(p: IPlayer, input: str
addAllScripts(); addAllScripts();
addAllLitFiles(); addAllLitFiles();
addAllTextFiles(); addAllTextFiles();
addAllDirectories();
return allPos; return allPos;
} }
@ -165,6 +248,7 @@ export function determineAllPossibilitiesForTabCompletion(p: IPlayer, input: str
if (isCommand("kill") || isCommand("tail") || isCommand("mem") || isCommand("check")) { if (isCommand("kill") || isCommand("tail") || isCommand("mem") || isCommand("check")) {
addAllScripts(); addAllScripts();
addAllDirectories();
return allPos; return allPos;
} }
@ -173,6 +257,7 @@ export function determineAllPossibilitiesForTabCompletion(p: IPlayer, input: str
addAllScripts(); addAllScripts();
addAllTextFiles(); addAllTextFiles();
allPos.push(".fconf"); allPos.push(".fconf");
addAllDirectories();
return allPos; return allPos;
} }
@ -183,6 +268,7 @@ export function determineAllPossibilitiesForTabCompletion(p: IPlayer, input: str
addAllLitFiles(); addAllLitFiles();
addAllTextFiles(); addAllTextFiles();
addAllCodingContracts(); addAllCodingContracts();
addAllDirectories();
return allPos; return allPos;
} }
@ -191,6 +277,7 @@ export function determineAllPossibilitiesForTabCompletion(p: IPlayer, input: str
addAllScripts(); addAllScripts();
addAllPrograms(); addAllPrograms();
addAllCodingContracts(); addAllCodingContracts();
addAllDirectories();
return allPos; return allPos;
} }
@ -199,6 +286,7 @@ export function determineAllPossibilitiesForTabCompletion(p: IPlayer, input: str
addAllMessages(); addAllMessages();
addAllLitFiles(); addAllLitFiles();
addAllTextFiles(); addAllTextFiles();
addAllDirectories();
return allPos; return allPos;
} }
@ -206,9 +294,20 @@ export function determineAllPossibilitiesForTabCompletion(p: IPlayer, input: str
if (isCommand("download") || isCommand("mv")) { if (isCommand("download") || isCommand("mv")) {
addAllScripts(); addAllScripts();
addAllTextFiles(); addAllTextFiles();
addAllDirectories();
return allPos; return allPos;
} }
if (isCommand("cd")) {
addAllDirectories();
return allPos;
}
if (isCommand("ls") && index === 0) {
addAllDirectories();
}
return allPos; return allPos;
} }

@ -621,7 +621,7 @@ export const codingContractTypesMetadata: ICodingContractTypeMetadata[] = [
numTries: 10, numTries: 10,
solver: (data: number[][], ans: string) => { solver: (data: number[][], ans: string) => {
let n: number = data.length; let n: number = data.length;
let dp: number[] = data[n-1]; let dp: number[] = data[n-1].slice();
for (let i = n-2; i > -1; --i) { for (let i = n-2; i > -1; --i) {
for (let j = 0; j < data[i].length; ++j) { for (let j = 0; j < data[i].length; ++j) {
dp[j] = Math.min(dp[j], dp[j + 1]) + data[i][j]; dp[j] = Math.min(dp[j], dp[j + 1]) + data[i][j];
@ -642,7 +642,7 @@ export const codingContractTypesMetadata: ICodingContractTypeMetadata[] = [
"move down or right on each step. Determine how many", "move down or right on each step. Determine how many",
"unique paths there are from start to finish.\n\n", "unique paths there are from start to finish.\n\n",
"NOTE: The data returned for this contract is an array", "NOTE: The data returned for this contract is an array",
"with the number or rows and columns:\n\n", "with the number of rows and columns:\n\n",
`[${numRows}, ${numColumns}]`].join(" "); `[${numRows}, ${numColumns}]`].join(" ");
}, },
difficulty: 3, difficulty: 3,