Merge branch 'dev' into fix/grafting-pre-reqs

This commit is contained in:
nickofolas 2022-03-30 21:12:44 -04:00
commit a80693dab2
51 changed files with 3511 additions and 3177 deletions

42
dist/vendor.bundle.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
letter_to_fandom.com Normal file

@ -0,0 +1 @@
I want the wiki here https://bitburner.fandom.com/wiki/Bitburner_Wiki taken down please.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -129,6 +129,6 @@
"electron:packager-win": "electron-packager .package bitburner --platform win32 --arch x64 --out .build --overwrite --icon .package/icon.png",
"electron:packager-mac": "electron-packager .package bitburner --platform darwin --arch x64 --out .build --overwrite --icon .package/icon.png",
"electron:packager-linux": "electron-packager .package bitburner --platform linux --arch x64 --out .build --overwrite --icon .package/icon.png",
"allbuild": "npm run build && npm run electron && git add --all && git commit -m \"allbuild commit $(which git)\" && git push -f -u origin dev"
"allbuild": "npm run build && npm run electron && git add --all && git commit -m \"allbuild commit $(git rev-parse --short HEAD)\" && git push -f -u origin dev"
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,234 +1,121 @@
export const AugmentationNames: {
Targeting1: string;
Targeting2: string;
Targeting3: string;
SyntheticHeart: string;
SynfibrilMuscle: string;
CombatRib1: string;
CombatRib2: string;
CombatRib3: string;
NanofiberWeave: string;
SubdermalArmor: string;
WiredReflexes: string;
GrapheneBoneLacings: string;
BionicSpine: string;
GrapheneBionicSpine: string;
BionicLegs: string;
GrapheneBionicLegs: string;
SpeechProcessor: string;
TITN41Injection: string;
EnhancedSocialInteractionImplant: string;
BitWire: string;
ArtificialBioNeuralNetwork: string;
ArtificialSynapticPotentiation: string;
EnhancedMyelinSheathing: string;
SynapticEnhancement: string;
NeuralRetentionEnhancement: string;
DataJack: string;
ENM: string;
ENMCore: string;
ENMCoreV2: string;
ENMCoreV3: string;
ENMAnalyzeEngine: string;
ENMDMA: string;
Neuralstimulator: string;
NeuralAccelerator: string;
CranialSignalProcessorsG1: string;
CranialSignalProcessorsG2: string;
CranialSignalProcessorsG3: string;
CranialSignalProcessorsG4: string;
CranialSignalProcessorsG5: string;
NeuronalDensification: string;
NeuroreceptorManager: string;
NuoptimalInjectorImplant: string;
SpeechEnhancement: string;
FocusWire: string;
PCDNI: string;
PCDNIOptimizer: string;
PCDNINeuralNetwork: string;
PCMatrix: string;
ADRPheromone1: string;
ADRPheromone2: string;
ShadowsSimulacrum: string;
HacknetNodeCPUUpload: string;
HacknetNodeCacheUpload: string;
HacknetNodeNICUpload: string;
HacknetNodeKernelDNI: string;
HacknetNodeCoreDNI: string;
NeuroFluxGovernor: string;
Neurotrainer1: string;
Neurotrainer2: string;
Neurotrainer3: string;
Hypersight: string;
LuminCloaking1: string;
LuminCloaking2: string;
HemoRecirculator: string;
SmartSonar: string;
PowerRecirculator: string;
QLink: string;
TheRedPill: string;
SPTN97: string;
HiveMind: string;
CordiARCReactor: string;
SmartJaw: string;
Neotra: string;
Xanipher: string;
nextSENS: string;
OmniTekInfoLoad: string;
PhotosyntheticCells: string;
Neurolink: string;
TheBlackHand: string;
UnstableCircadianModulator: string;
CRTX42AA: string;
Neuregen: string;
CashRoot: string;
NutriGen: string;
INFRARet: string;
DermaForce: string;
GrapheneBrachiBlades: string;
GrapheneBionicArms: string;
BrachiBlades: string;
BionicArms: string;
SNA: string;
HydroflameLeftArm: string;
EsperEyewear: string;
EMS4Recombination: string;
OrionShoulder: string;
HyperionV1: string;
HyperionV2: string;
GolemSerum: string;
VangelisVirus: string;
VangelisVirus3: string;
INTERLINKED: string;
BladeRunner: string;
BladeArmor: string;
BladeArmorPowerCells: string;
BladeArmorEnergyShielding: string;
BladeArmorUnibeam: string;
BladeArmorOmnibeam: string;
BladeArmorIPU: string;
BladesSimulacrum: string;
StaneksGift1: string;
StaneksGift2: string;
StaneksGift3: string;
} = {
Targeting1: "Augmented Targeting I",
Targeting2: "Augmented Targeting II",
Targeting3: "Augmented Targeting III",
SyntheticHeart: "Synthetic Heart",
SynfibrilMuscle: "Synfibril Muscle",
CombatRib1: "Combat Rib I",
CombatRib2: "Combat Rib II",
CombatRib3: "Combat Rib III",
NanofiberWeave: "Nanofiber Weave",
SubdermalArmor: "NEMEAN Subdermal Weave",
WiredReflexes: "Wired Reflexes",
GrapheneBoneLacings: "Graphene Bone Lacings",
BionicSpine: "Bionic Spine",
GrapheneBionicSpine: "Graphene Bionic Spine Upgrade",
BionicLegs: "Bionic Legs",
GrapheneBionicLegs: "Graphene Bionic Legs Upgrade",
SpeechProcessor: "Speech Processor Implant",
TITN41Injection: "TITN-41 Gene-Modification Injection",
EnhancedSocialInteractionImplant: "Enhanced Social Interaction Implant",
BitWire: "BitWire",
ArtificialBioNeuralNetwork: "Artificial Bio-neural Network Implant",
ArtificialSynapticPotentiation: "Artificial Synaptic Potentiation",
EnhancedMyelinSheathing: "Enhanced Myelin Sheathing",
SynapticEnhancement: "Synaptic Enhancement Implant",
NeuralRetentionEnhancement: "Neural-Retention Enhancement",
DataJack: "DataJack",
ENM: "Embedded Netburner Module",
ENMCore: "Embedded Netburner Module Core Implant",
ENMCoreV2: "Embedded Netburner Module Core V2 Upgrade",
ENMCoreV3: "Embedded Netburner Module Core V3 Upgrade",
ENMAnalyzeEngine: "Embedded Netburner Module Analyze Engine",
ENMDMA: "Embedded Netburner Module Direct Memory Access Upgrade",
Neuralstimulator: "Neuralstimulator",
NeuralAccelerator: "Neural Accelerator",
CranialSignalProcessorsG1: "Cranial Signal Processors - Gen I",
CranialSignalProcessorsG2: "Cranial Signal Processors - Gen II",
CranialSignalProcessorsG3: "Cranial Signal Processors - Gen III",
CranialSignalProcessorsG4: "Cranial Signal Processors - Gen IV",
CranialSignalProcessorsG5: "Cranial Signal Processors - Gen V",
NeuronalDensification: "Neuronal Densification",
NeuroreceptorManager: "Neuroreceptor Management Implant",
NuoptimalInjectorImplant: "Nuoptimal Nootropic Injector Implant",
SpeechEnhancement: "Speech Enhancement",
FocusWire: "FocusWire",
PCDNI: "PC Direct-Neural Interface",
PCDNIOptimizer: "PC Direct-Neural Interface Optimization Submodule",
PCDNINeuralNetwork: "PC Direct-Neural Interface NeuroNet Injector",
PCMatrix: "PCMatrix",
ADRPheromone1: "ADR-V1 Pheromone Gene",
ADRPheromone2: "ADR-V2 Pheromone Gene",
ShadowsSimulacrum: "The Shadow's Simulacrum",
HacknetNodeCPUUpload: "Hacknet Node CPU Architecture Neural-Upload",
HacknetNodeCacheUpload: "Hacknet Node Cache Architecture Neural-Upload",
HacknetNodeNICUpload: "Hacknet Node NIC Architecture Neural-Upload",
HacknetNodeKernelDNI: "Hacknet Node Kernel Direct-Neural Interface",
HacknetNodeCoreDNI: "Hacknet Node Core Direct-Neural Interface",
NeuroFluxGovernor: "NeuroFlux Governor",
Neurotrainer1: "Neurotrainer I",
Neurotrainer2: "Neurotrainer II",
Neurotrainer3: "Neurotrainer III",
Hypersight: "HyperSight Corneal Implant",
LuminCloaking1: "LuminCloaking-V1 Skin Implant",
LuminCloaking2: "LuminCloaking-V2 Skin Implant",
HemoRecirculator: "HemoRecirculator",
SmartSonar: "SmartSonar Implant",
PowerRecirculator: "Power Recirculation Core",
QLink: "QLink",
TheRedPill: "The Red Pill",
SPTN97: "SPTN-97 Gene Modification",
HiveMind: "ECorp HVMind Implant",
CordiARCReactor: "CordiARC Fusion Reactor",
SmartJaw: "SmartJaw",
Neotra: "Neotra",
Xanipher: "Xanipher",
nextSENS: "nextSENS Gene Modification",
OmniTekInfoLoad: "OmniTek InfoLoad",
PhotosyntheticCells: "Photosynthetic Cells",
Neurolink: "BitRunners Neurolink",
TheBlackHand: "The Black Hand",
UnstableCircadianModulator: "Unstable Circadian Modulator",
CRTX42AA: "CRTX42-AA Gene Modification",
Neuregen: "Neuregen Gene Modification",
CashRoot: "CashRoot Starter Kit",
NutriGen: "NutriGen Implant",
INFRARet: "INFRARET Enhancement",
DermaForce: "DermaForce Particle Barrier",
GrapheneBrachiBlades: "Graphene BrachiBlades Upgrade",
GrapheneBionicArms: "Graphene Bionic Arms Upgrade",
BrachiBlades: "BrachiBlades",
BionicArms: "Bionic Arms",
SNA: "Social Negotiation Assistant (S.N.A)",
HydroflameLeftArm: "Hydroflame Left Arm",
EsperEyewear: "EsperTech Bladeburner Eyewear",
EMS4Recombination: "EMS-4 Recombination",
OrionShoulder: "ORION-MKIV Shoulder",
HyperionV1: "Hyperion Plasma Cannon V1",
HyperionV2: "Hyperion Plasma Cannon V2",
GolemSerum: "GOLEM Serum",
VangelisVirus: "Vangelis Virus",
VangelisVirus3: "Vangelis Virus 3.0",
INTERLINKED: "I.N.T.E.R.L.I.N.K.E.D",
BladeRunner: "Blade's Runners",
BladeArmor: "BLADE-51b Tesla Armor",
BladeArmorPowerCells: "BLADE-51b Tesla Armor: Power Cells Upgrade",
BladeArmorEnergyShielding: "BLADE-51b Tesla Armor: Energy Shielding Upgrade",
BladeArmorUnibeam: "BLADE-51b Tesla Armor: Unibeam Upgrade",
BladeArmorOmnibeam: "BLADE-51b Tesla Armor: Omnibeam Upgrade",
BladeArmorIPU: "BLADE-51b Tesla Armor: IPU Upgrade",
BladesSimulacrum: "The Blade's Simulacrum",
export enum AugmentationNames {
Targeting1 = "Augmented Targeting I",
Targeting2 = "Augmented Targeting II",
Targeting3 = "Augmented Targeting III",
SyntheticHeart = "Synthetic Heart",
SynfibrilMuscle = "Synfibril Muscle",
CombatRib1 = "Combat Rib I",
CombatRib2 = "Combat Rib II",
CombatRib3 = "Combat Rib III",
NanofiberWeave = "Nanofiber Weave",
SubdermalArmor = "NEMEAN Subdermal Weave",
WiredReflexes = "Wired Reflexes",
GrapheneBoneLacings = "Graphene Bone Lacings",
BionicSpine = "Bionic Spine",
GrapheneBionicSpine = "Graphene Bionic Spine Upgrade",
BionicLegs = "Bionic Legs",
GrapheneBionicLegs = "Graphene Bionic Legs Upgrade",
SpeechProcessor = "Speech Processor Implant",
TITN41Injection = "TITN-41 Gene-Modification Injection",
EnhancedSocialInteractionImplant = "Enhanced Social Interaction Implant",
BitWire = "BitWire",
ArtificialBioNeuralNetwork = "Artificial Bio-neural Network Implant",
ArtificialSynapticPotentiation = "Artificial Synaptic Potentiation",
EnhancedMyelinSheathing = "Enhanced Myelin Sheathing",
SynapticEnhancement = "Synaptic Enhancement Implant",
NeuralRetentionEnhancement = "Neural-Retention Enhancement",
DataJack = "DataJack",
ENM = "Embedded Netburner Module",
ENMCore = "Embedded Netburner Module Core Implant",
ENMCoreV2 = "Embedded Netburner Module Core V2 Upgrade",
ENMCoreV3 = "Embedded Netburner Module Core V3 Upgrade",
ENMAnalyzeEngine = "Embedded Netburner Module Analyze Engine",
ENMDMA = "Embedded Netburner Module Direct Memory Access Upgrade",
Neuralstimulator = "Neuralstimulator",
NeuralAccelerator = "Neural Accelerator",
CranialSignalProcessorsG1 = "Cranial Signal Processors - Gen I",
CranialSignalProcessorsG2 = "Cranial Signal Processors - Gen II",
CranialSignalProcessorsG3 = "Cranial Signal Processors - Gen III",
CranialSignalProcessorsG4 = "Cranial Signal Processors - Gen IV",
CranialSignalProcessorsG5 = "Cranial Signal Processors - Gen V",
NeuronalDensification = "Neuronal Densification",
NeuroreceptorManager = "Neuroreceptor Management Implant",
NuoptimalInjectorImplant = "Nuoptimal Nootropic Injector Implant",
SpeechEnhancement = "Speech Enhancement",
FocusWire = "FocusWire",
PCDNI = "PC Direct-Neural Interface",
PCDNIOptimizer = "PC Direct-Neural Interface Optimization Submodule",
PCDNINeuralNetwork = "PC Direct-Neural Interface NeuroNet Injector",
PCMatrix = "PCMatrix",
ADRPheromone1 = "ADR-V1 Pheromone Gene",
ADRPheromone2 = "ADR-V2 Pheromone Gene",
ShadowsSimulacrum = "The Shadow's Simulacrum",
HacknetNodeCPUUpload = "Hacknet Node CPU Architecture Neural-Upload",
HacknetNodeCacheUpload = "Hacknet Node Cache Architecture Neural-Upload",
HacknetNodeNICUpload = "Hacknet Node NIC Architecture Neural-Upload",
HacknetNodeKernelDNI = "Hacknet Node Kernel Direct-Neural Interface",
HacknetNodeCoreDNI = "Hacknet Node Core Direct-Neural Interface",
NeuroFluxGovernor = "NeuroFlux Governor",
Neurotrainer1 = "Neurotrainer I",
Neurotrainer2 = "Neurotrainer II",
Neurotrainer3 = "Neurotrainer III",
Hypersight = "HyperSight Corneal Implant",
LuminCloaking1 = "LuminCloaking-V1 Skin Implant",
LuminCloaking2 = "LuminCloaking-V2 Skin Implant",
HemoRecirculator = "HemoRecirculator",
SmartSonar = "SmartSonar Implant",
PowerRecirculator = "Power Recirculation Core",
QLink = "QLink",
TheRedPill = "The Red Pill",
SPTN97 = "SPTN-97 Gene Modification",
HiveMind = "ECorp HVMind Implant",
CordiARCReactor = "CordiARC Fusion Reactor",
SmartJaw = "SmartJaw",
Neotra = "Neotra",
Xanipher = "Xanipher",
nextSENS = "nextSENS Gene Modification",
OmniTekInfoLoad = "OmniTek InfoLoad",
PhotosyntheticCells = "Photosynthetic Cells",
Neurolink = "BitRunners Neurolink",
TheBlackHand = "The Black Hand",
UnstableCircadianModulator = "Unstable Circadian Modulator",
CRTX42AA = "CRTX42-AA Gene Modification",
Neuregen = "Neuregen Gene Modification",
CashRoot = "CashRoot Starter Kit",
NutriGen = "NutriGen Implant",
INFRARet = "INFRARET Enhancement",
DermaForce = "DermaForce Particle Barrier",
GrapheneBrachiBlades = "Graphene BrachiBlades Upgrade",
GrapheneBionicArms = "Graphene Bionic Arms Upgrade",
BrachiBlades = "BrachiBlades",
BionicArms = "Bionic Arms",
SNA = "Social Negotiation Assistant (S.N.A)",
HydroflameLeftArm = "Hydroflame Left Arm",
EsperEyewear = "EsperTech Bladeburner Eyewear",
EMS4Recombination = "EMS-4 Recombination",
OrionShoulder = "ORION-MKIV Shoulder",
HyperionV1 = "Hyperion Plasma Cannon V1",
HyperionV2 = "Hyperion Plasma Cannon V2",
GolemSerum = "GOLEM Serum",
VangelisVirus = "Vangelis Virus",
VangelisVirus3 = "Vangelis Virus 3.0",
INTERLINKED = "I.N.T.E.R.L.I.N.K.E.D",
BladeRunner = "Blade's Runners",
BladeArmor = "BLADE-51b Tesla Armor",
BladeArmorPowerCells = "BLADE-51b Tesla Armor: Power Cells Upgrade",
BladeArmorEnergyShielding = "BLADE-51b Tesla Armor: Energy Shielding Upgrade",
BladeArmorUnibeam = "BLADE-51b Tesla Armor: Unibeam Upgrade",
BladeArmorOmnibeam = "BLADE-51b Tesla Armor: Omnibeam Upgrade",
BladeArmorIPU = "BLADE-51b Tesla Armor: IPU Upgrade",
BladesSimulacrum = "The Blade's Simulacrum",
StaneksGift1: "Stanek's Gift - Genesis",
StaneksGift2: "Stanek's Gift - Awakening",
StaneksGift3: "Stanek's Gift - Serenity",
StaneksGift1 = "Stanek's Gift - Genesis",
StaneksGift2 = "Stanek's Gift - Awakening",
StaneksGift3 = "Stanek's Gift - Serenity",
//Wasteland Augs
//PepBoy: "P.E.P-Boy", Plasma Energy Projection System
//PepBoyForceField Generates plasma force fields
//PepBoyBlasts Generate high density plasma concussive blasts
//PepBoyDataStorage STore more data on pep boy,
};
}

@ -82,7 +82,9 @@ BitNodes["BitNode2"] = new BitNode(
<br />
The amount of money gained from crimes and Infiltration is tripled
<br />
Certain Factions ({FactionNames.SlumSnakes}, {FactionNames.Tetrads}, {FactionNames.TheSyndicate}, {FactionNames.TheDarkArmy}, {FactionNames.SpeakersForTheDead}, {FactionNames.NiteSec}, {FactionNames.TheBlackHand}) give the player the ability to form and manage their own gangs. These gangs will earn the player money and
Certain Factions ({FactionNames.SlumSnakes}, {FactionNames.Tetrads}, {FactionNames.TheSyndicate},{" "}
{FactionNames.TheDarkArmy}, {FactionNames.SpeakersForTheDead}, {FactionNames.NiteSec}, {FactionNames.TheBlackHand}
) give the player the ability to form and manage their own gangs. These gangs will earn the player money and
reputation with the corresponding Faction
<br />
Every Augmentation in the game will be available through the Factions listed above
@ -225,15 +227,15 @@ BitNodes["BitNode6"] = new BitNode(
"Like Tears in Rain",
(
<>
In the middle of the 21st century, {FactionNames.OmniTekIncorporated} began designing and manufacturing advanced synthetic
androids, or Synthoids for short. They achieved a major technological breakthrough in the sixth generation of
their Synthoid design, called MK-VI, by developing a hyperintelligent AI. Many argue that this was the first
sentient AI ever created. This resulted in Synthoid models that were stronger, faster, and more intelligent than
the humans that had created them.
In the middle of the 21st century, {FactionNames.OmniTekIncorporated} began designing and manufacturing advanced
synthetic androids, or Synthoids for short. They achieved a major technological breakthrough in the sixth
generation of their Synthoid design, called MK-VI, by developing a hyperintelligent AI. Many argue that this was
the first sentient AI ever created. This resulted in Synthoid models that were stronger, faster, and more
intelligent than the humans that had created them.
<br />
<br />
In this BitNode you will be able to access the {FactionNames.Bladeburners} Division at the NSA, which provides a new mechanic for
progression. Furthermore:
In this BitNode you will be able to access the {FactionNames.Bladeburners} Division at the NSA, which provides a
new mechanic for progression. Furthermore:
<br />
<br />
Hacking and Hacknet Nodes will be less profitable
@ -250,9 +252,9 @@ BitNodes["BitNode6"] = new BitNode(
<br />
<br />
Destroying this BitNode will give you Source-File 6, or if you already have this Source-File it will upgrade its
level up to a maximum of 3. This Source-File allows you to access the NSA's {FactionNames.Bladeburners} Division in other
BitNodes. In addition, this Source-File will raise both the level and experience gain rate of all your combat
stats by:
level up to a maximum of 3. This Source-File allows you to access the NSA's {FactionNames.Bladeburners} Division
in other BitNodes. In addition, this Source-File will raise both the level and experience gain rate of all your
combat stats by:
<br />
<br />
Level 1: 8%
@ -270,14 +272,15 @@ BitNodes["BitNode7"] = new BitNode(
"More human than humans",
(
<>
In the middle of the 21st century, you were doing cutting-edge work at {FactionNames.OmniTekIncorporated} as part of the AI
design team for advanced synthetic androids, or Synthoids for short. You helped achieve a major technological
breakthrough in the sixth generation of the company's Synthoid design, called MK-VI, by developing a
In the middle of the 21st century, you were doing cutting-edge work at {FactionNames.OmniTekIncorporated} as part
of the AI design team for advanced synthetic androids, or Synthoids for short. You helped achieve a major
technological breakthrough in the sixth generation of the company's Synthoid design, called MK-VI, by developing a
hyperintelligent AI. Many argue that this was the first sentient AI ever created. This resulted in Synthoid models
that were stronger, faster, and more intelligent than the humans that had created them.
<br />
<br />
In this BitNode you will be able to access the {FactionNames.Bladeburners} API, which allows you to access {FactionNames.Bladeburners}
In this BitNode you will be able to access the {FactionNames.Bladeburners} API, which allows you to access{" "}
{FactionNames.Bladeburners}
functionality through Netscript. Furthermore: <br />
<br />
The rank you gain from {FactionNames.Bladeburners} contracts/operations is reduced by 40%
@ -300,8 +303,9 @@ BitNodes["BitNode7"] = new BitNode(
<br />
<br />
Destroying this BitNode will give you Source-File 7, or if you already have this Source-File it will upgrade its
level up to a maximum of 3. This Source-File allows you to access the {FactionNames.Bladeburners} Netscript API in other BitNodes.
In addition, this Source-File will increase all of your {FactionNames.Bladeburners} multipliers by:
level up to a maximum of 3. This Source-File allows you to access the {FactionNames.Bladeburners} Netscript API in
other BitNodes. In addition, this Source-File will increase all of your {FactionNames.Bladeburners} multipliers
by:
<br />
<br />
Level 1: 8%
@ -364,10 +368,10 @@ BitNodes["BitNode9"] = new BitNode(
"Hacknet Unleashed",
(
<>
When {FactionNames.FulcrumSecretTechnologies} released their open-source Linux distro Chapeau, it quickly became the OS of choice for
the underground hacking community. Chapeau became especially notorious for powering the Hacknet, a global,
decentralized network used for nefarious purposes. {FactionNames.FulcrumSecretTechnologies} quickly abandoned the project and dissociated
themselves from it.
When {FactionNames.FulcrumSecretTechnologies} released their open-source Linux distro Chapeau, it quickly became
the OS of choice for the underground hacking community. Chapeau became especially notorious for powering the
Hacknet, a global, decentralized network used for nefarious purposes. {FactionNames.FulcrumSecretTechnologies}{" "}
quickly abandoned the project and dissociated themselves from it.
<br />
<br />
This BitNode unlocks the Hacknet Server, an upgraded version of the Hacknet Node. Hacknet Servers generate hashes,
@ -538,8 +542,8 @@ BitNodes["BitNode13"] = new BitNode(
"1 step back, 2 steps forward",
(
<>
With the invention of Augmentations in the 2040s a religious group known as the {FactionNames.ChurchOfTheMachineGod} has
rallied far more support than anyone would have hoped.
With the invention of Augmentations in the 2040s a religious group known as the{" "}
{FactionNames.ChurchOfTheMachineGod} has rallied far more support than anyone would have hoped.
<br />
<br />
Their leader, Allison "Mother" Stanek is said to have created her own Augmentation whose power goes beyond any
@ -555,7 +559,8 @@ BitNodes["BitNode13"] = new BitNode(
<br />
<br />
Destroying this BitNode will give you Source-File 13, or if you already have this Source-File it will upgrade its
level up to a maximum of 3. This Source-File lets the {FactionNames.ChurchOfTheMachineGod} appear in other BitNodes.
level up to a maximum of 3. This Source-File lets the {FactionNames.ChurchOfTheMachineGod} appear in other
BitNodes.
<br />
<br />
Each level of this Source-File increases the size of Stanek's Gift.
@ -624,6 +629,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
BitNodeMultipliers.PurchasedServerSoftcap = 1.3;
BitNodeMultipliers.GangSoftcap = 0.9;
BitNodeMultipliers.WorldDaemonDifficulty = 2;
BitNodeMultipliers.GangUniqueAugs = 0.5;
break;
case 4: // The Singularity
BitNodeMultipliers.ServerMaxMoney = 0.15;
@ -642,6 +648,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
BitNodeMultipliers.StaneksGiftExtraSize = 0;
BitNodeMultipliers.PurchasedServerSoftcap = 1.2;
BitNodeMultipliers.WorldDaemonDifficulty = 3;
BitNodeMultipliers.GangUniqueAugs = 0.5;
break;
case 5: // Artificial intelligence
BitNodeMultipliers.ServerMaxMoney = 2;
@ -659,6 +666,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
BitNodeMultipliers.StaneksGiftExtraSize = 0;
BitNodeMultipliers.PurchasedServerSoftcap = 1.2;
BitNodeMultipliers.WorldDaemonDifficulty = 1.5;
BitNodeMultipliers.GangUniqueAugs = 0.5;
break;
case 6: // Bladeburner
BitNodeMultipliers.HackingLevelMultiplier = 0.35;
@ -679,6 +687,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
BitNodeMultipliers.GangSoftcap = 0.7;
BitNodeMultipliers.CorporationSoftCap = 0.9;
BitNodeMultipliers.WorldDaemonDifficulty = 2;
BitNodeMultipliers.GangUniqueAugs = 0.2;
break;
case 7: // Bladeburner 2079
BitNodeMultipliers.BladeburnerRank = 0.6;
@ -704,6 +713,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
BitNodeMultipliers.GangSoftcap = 0.7;
BitNodeMultipliers.CorporationSoftCap = 0.9;
BitNodeMultipliers.WorldDaemonDifficulty = 2;
BitNodeMultipliers.GangUniqueAugs = 0.2;
break;
case 8: // Ghost of Wall Street
BitNodeMultipliers.ScriptHackMoney = 0.3;
@ -720,6 +730,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
BitNodeMultipliers.PurchasedServerSoftcap = 4;
BitNodeMultipliers.GangSoftcap = 0;
BitNodeMultipliers.CorporationSoftCap = 0;
BitNodeMultipliers.GangUniqueAugs = 0;
break;
case 9: // Hacktocracy
BitNodeMultipliers.HackingLevelMultiplier = 0.5;
@ -746,6 +757,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
BitNodeMultipliers.GangSoftcap = 0.8;
BitNodeMultipliers.CorporationSoftCap = 0.7;
BitNodeMultipliers.WorldDaemonDifficulty = 2;
BitNodeMultipliers.GangUniqueAugs = 0.25;
break;
case 10: // Digital Carbon
BitNodeMultipliers.HackingLevelMultiplier = 0.35;
@ -775,6 +787,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
BitNodeMultipliers.GangSoftcap = 0.9;
BitNodeMultipliers.CorporationSoftCap = 0.9;
BitNodeMultipliers.WorldDaemonDifficulty = 2;
BitNodeMultipliers.GangUniqueAugs = 0.25;
break;
case 11: //The Big Crash
BitNodeMultipliers.HackingLevelMultiplier = 0.6;
@ -796,6 +809,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
BitNodeMultipliers.PurchasedServerSoftcap = 2;
BitNodeMultipliers.CorporationSoftCap = 0.9;
BitNodeMultipliers.WorldDaemonDifficulty = 1.5;
BitNodeMultipliers.GangUniqueAugs = 0.75;
break;
case 12: {
//The Recursion
@ -870,6 +884,8 @@ export function initBitNodeMultipliers(p: IPlayer): void {
BitNodeMultipliers.GangSoftcap = 0.8;
BitNodeMultipliers.CorporationSoftCap = 0.8;
BitNodeMultipliers.WorldDaemonDifficulty = inc;
BitNodeMultipliers.GangUniqueAugs = dec;
break;
}
case 13: {
@ -912,6 +928,7 @@ export function initBitNodeMultipliers(p: IPlayer): void {
BitNodeMultipliers.GangSoftcap = 0.3;
BitNodeMultipliers.CorporationSoftCap = 0.3;
BitNodeMultipliers.WorldDaemonDifficulty = 3;
BitNodeMultipliers.GangUniqueAugs = 0.1;
break;
}
default:

@ -114,6 +114,11 @@ interface IBitNodeMultipliers {
*/
GangSoftcap: number;
/**
* Percentage of unique augs that the gang has.
*/
GangUniqueAugs: number;
/**
* Influences the experienced gained when hacking a server.
*/
@ -232,6 +237,11 @@ interface IBitNodeMultipliers {
*/
WorldDaemonDifficulty: number;
/**
* Influences corporation dividends.
*/
CorporationSoftCap: number;
// Index signature
[key: string]: number;
}
@ -295,6 +305,7 @@ export const BitNodeMultipliers: IBitNodeMultipliers = {
BladeburnerSkillCost: 1,
GangSoftcap: 1,
GangUniqueAugs: 1,
DaedalusAugsRequirement: 1,

@ -35,6 +35,7 @@ import { joinFaction } from "../Faction/FactionHelpers";
import { WorkerScript } from "../Netscript/WorkerScript";
import { FactionNames } from "../Faction/data/FactionNames";
import { BlackOperationNames } from "./data/BlackOperationNames";
import { KEY } from "../utils/helpers/keyCodes";
interface BlackOpsAttempt {
error?: string;
@ -793,7 +794,7 @@ export class Bladeburner implements IBladeburner {
if (c === '"') {
// Double quotes
const endQuote = command.indexOf('"', i + 1);
if (endQuote !== -1 && (endQuote === command.length - 1 || command.charAt(endQuote + 1) === " ")) {
if (endQuote !== -1 && (endQuote === command.length - 1 || command.charAt(endQuote + 1) === KEY.SPACE)) {
args.push(command.substr(i + 1, endQuote - i - 1));
if (endQuote === command.length - 1) {
start = i = endQuote + 1;
@ -805,7 +806,7 @@ export class Bladeburner implements IBladeburner {
} else if (c === "'") {
// Single quotes, same thing as above
const endQuote = command.indexOf("'", i + 1);
if (endQuote !== -1 && (endQuote === command.length - 1 || command.charAt(endQuote + 1) === " ")) {
if (endQuote !== -1 && (endQuote === command.length - 1 || command.charAt(endQuote + 1) === KEY.SPACE)) {
args.push(command.substr(i + 1, endQuote - i - 1));
if (endQuote === command.length - 1) {
start = i = endQuote + 1;
@ -814,7 +815,7 @@ export class Bladeburner implements IBladeburner {
}
continue;
}
} else if (c === " ") {
} else if (c === KEY.SPACE) {
args.push(command.substr(start, i - start));
start = i + 1;
}

@ -89,7 +89,7 @@ export function Console(props: IProps): React.ReactElement {
const consoleHistory = props.bladeburner.consoleHistory;
if (event.key === KEY.UPARROW) {
if (event.key === KEY.UP_ARROW) {
// up
let i = consoleHistoryIndex;
const len = consoleHistory.length;
@ -109,7 +109,7 @@ export function Console(props: IProps): React.ReactElement {
setCommand(prevCommand);
}
if (event.key === KEY.DOWNARROW) {
if (event.key === KEY.DOWN_ARROW) {
const i = consoleHistoryIndex;
const len = consoleHistory.length;
@ -140,14 +140,16 @@ export function Console(props: IProps): React.ReactElement {
return (
<Paper sx={{ p: 1 }}>
<Box sx={{
height: '60vh',
paddingBottom: '8px',
display: 'flex',
alignItems: 'stretch',
whiteSpace: 'pre-wrap',
}}
onClick={handleClick}>
<Box
sx={{
height: "60vh",
paddingBottom: "8px",
display: "flex",
alignItems: "stretch",
whiteSpace: "pre-wrap",
}}
onClick={handleClick}
>
<Box>
<Logs entries={[...props.bladeburner.consoleLogs]} />
</Box>
@ -195,9 +197,7 @@ function Logs({ entries }: ILogProps): React.ReactElement {
return (
<List sx={{ height: "100%", overflow: "auto", p: 1 }} ref={scrollHook}>
{entries && entries.map((log: any, i: number) => (
<Line key={i} content={log} />
))}
{entries && entries.map((log: any, i: number) => <Line key={i} content={log} />)}
</List>
);
}

@ -61,3 +61,35 @@ export class WHRNG implements RNG {
return (this.s1 / 30269.0 + this.s2 / 30307.0 + this.s3 / 30323.0) % 1.0;
}
}
export function SFC32RNG(seed: string): () => number {
let h = 1779033703 ^ seed.length;
for (let i = 0; i < seed.length; i++) {
h = Math.imul(h ^ seed.charCodeAt(i), 3432918353);
h = (h << 13) | (h >>> 19);
}
const genSeed = (): number => {
h = Math.imul(h ^ (h >>> 16), 2246822507);
h = Math.imul(h ^ (h >>> 13), 3266489909);
return (h ^= h >>> 16) >>> 0;
};
let a = genSeed();
let b = genSeed();
let c = genSeed();
let d = genSeed();
return (): number => {
a >>>= 0;
b >>>= 0;
c >>>= 0;
d >>>= 0;
let t = (a + b) | 0;
a = b ^ (b >>> 9);
b = (c + (c << 3)) | 0;
c = (c << 21) | (c >>> 11);
d = (d + 1) | 0;
t = (t + d) | 0;
c = (c + t) | 0;
return (t >>> 0) / 4294967296;
};
}

@ -1,5 +1,5 @@
import { IPlayer } from 'src/PersonObjects/IPlayer';
import { MaterialSizes } from './MaterialSizes';
import { IPlayer } from "src/PersonObjects/IPlayer";
import { MaterialSizes } from "./MaterialSizes";
import { ICorporation } from "./ICorporation";
import { IIndustry } from "./IIndustry";
import { IndustryStartingCosts, IndustryResearchTrees } from "./IndustryData";
@ -17,6 +17,7 @@ import { Employee } from "./Employee";
import { IndustryUpgrades } from "./IndustryUpgrades";
import { ResearchMap } from "./ResearchMap";
import { isRelevantMaterial } from "./ui/Helpers";
import { CityName } from "src/Locations/data/CityNames";
export function NewIndustry(corporation: ICorporation, industry: string, name: string): void {
if (corporation.divisions.find(({ type }) => industry == type))
@ -64,7 +65,7 @@ export function UnlockUpgrade(corporation: ICorporation, upgrade: CorporationUnl
if (corporation.funds < upgrade[1]) {
throw new Error("Insufficient funds");
}
if(corporation.unlockUpgrades[upgrade[0]] === 1){
if (corporation.unlockUpgrades[upgrade[0]] === 1) {
throw new Error(`You have already unlocked the ${upgrade[2]} upgrade!`);
}
corporation.unlock(upgrade);
@ -222,15 +223,15 @@ export function SellProduct(product: Product, city: string, amt: string, price:
product.sllman[city][1] = "";
}
} else if (all) {
for (let i = 0; i < cities.length; ++i) {
const tempCity = cities[i];
product.sllman[tempCity][0] = true;
product.sllman[tempCity][1] = qty;
}
} else {
product.sllman[city][0] = true;
product.sllman[city][1] = qty;
for (let i = 0; i < cities.length; ++i) {
const tempCity = cities[i];
product.sllman[tempCity][0] = true;
product.sllman[tempCity][1] = qty;
}
} else {
product.sllman[city][0] = true;
product.sllman[city][1] = qty;
}
}
}
@ -257,7 +258,7 @@ export function BulkPurchase(corp: ICorporation, warehouse: Warehouse, material:
if (isNaN(amt) || amt < 0) {
throw new Error(`Invalid input amount`);
}
if (amt * matSize > maxAmount) {
if (amt * matSize <= maxAmount) {
throw new Error(`You do not have enough warehouse size to fit this purchase`);
}
const cost = amt * material.bCost;
@ -295,7 +296,7 @@ export function BuyBackShares(corporation: ICorporation, player: IPlayer, numSha
if (numShares > corporation.issuedShares) throw new Error("You don't have that many shares to buy!");
if (!corporation.public) throw new Error("You haven't gone public!");
const buybackPrice = corporation.sharePrice * 1.1;
if (player.money < (numShares * buybackPrice)) throw new Error("You cant afford that many shares!");
if (player.money < numShares * buybackPrice) throw new Error("You cant afford that many shares!");
corporation.numShares += numShares;
corporation.issuedShares -= numShares;
player.loseMoney(numShares * buybackPrice, "corporation");
@ -404,13 +405,13 @@ export function MakeProduct(
if (corp.funds < designInvest + marketingInvest) {
throw new Error("You don't have enough company funds to make this large of an investment");
}
let maxProducts = 3
let maxProducts = 3;
if (division.hasResearch("uPgrade: Capacity.II")) {
maxProducts = 5
maxProducts = 5;
} else if (division.hasResearch("uPgrade: Capacity.I")) {
maxProducts = 4
maxProducts = 4;
}
const products = division.products
const products = division.products;
if (Object.keys(products).length >= maxProducts) {
throw new Error(`You are already at the max products (${maxProducts}) for division: ${division.name}!`);
}
@ -445,7 +446,13 @@ export function Research(division: IIndustry, researchName: string): void {
division.researched[researchName] = true;
}
export function ExportMaterial(divisionName: string, cityName: string, material: Material, amt: string, division?: Industry): void {
export function ExportMaterial(
divisionName: string,
cityName: string,
material: Material,
amt: string,
division?: Industry,
): void {
// Sanitize amt
let sanitizedAmt = amt.replace(/\s+/g, "").toUpperCase();
sanitizedAmt = sanitizedAmt.replace(/[^-()\d/*+.MAX]/g, "");

@ -8,6 +8,7 @@ import { CONSTANTS } from "../Constants";
import { Faction } from "./Faction";
import { Factions } from "./Factions";
import { Player } from "../Player";
import { IPlayer } from "../PersonObjects/IPlayer";
import { Settings } from "../Settings/Settings";
import {
getHackingWorkRepGain,
@ -19,6 +20,7 @@ import { SourceFileFlags } from "../SourceFile/SourceFileFlags";
import { dialogBoxCreate } from "../ui/React/DialogBox";
import { InvitationEvent } from "./ui/InvitationModal";
import { FactionNames } from "./data/FactionNames";
import { SFC32RNG } from "../Casino/RNG";
export function inviteToFaction(faction: Faction): void {
Player.receiveInvite(faction.name);
@ -32,9 +34,8 @@ export function joinFaction(faction: Faction): void {
if (faction.isMember) return;
faction.isMember = true;
Player.factions.push(faction.name);
const allFactions = Object.values(FactionNames).map(faction => faction as string)
Player.factions.sort((a, b) =>
allFactions.indexOf(a) - allFactions.indexOf(b));
const allFactions = Object.values(FactionNames).map((faction) => faction as string);
Player.factions.sort((a, b) => allFactions.indexOf(a) - allFactions.indexOf(b));
const factionInfo = faction.getInfo();
//Determine what factions you are banned from now that you have joined this faction
@ -134,18 +135,18 @@ export function purchaseAugmentation(aug: Augmentation, fac: Faction, sing = fal
} else if (!Settings.SuppressBuyAugmentationConfirmation) {
dialogBoxCreate(
"You purchased " +
aug.name +
". Its enhancements will not take " +
"effect until they are installed. To install your augmentations, go to the " +
"'Augmentations' tab on the left-hand navigation menu. Purchasing additional " +
"augmentations will now be more expensive.",
aug.name +
". Its enhancements will not take " +
"effect until they are installed. To install your augmentations, go to the " +
"'Augmentations' tab on the left-hand navigation menu. Purchasing additional " +
"augmentations will now be more expensive.",
);
}
} else {
dialogBoxCreate(
"Hmm, something went wrong when trying to purchase an Augmentation. " +
"Please report this to the game developer with an explanation of how to " +
"reproduce this.",
"Please report this to the game developer with an explanation of how to " +
"reproduce this.",
);
}
return "";
@ -193,3 +194,43 @@ export function processPassiveFactionRepGain(numCycles: number): void {
faction.playerReputation += rate * numCycles * Player.faction_rep_mult * BitNodeMultipliers.FactionPassiveRepGain;
}
}
export const getFactionAugmentationsFiltered = (player: IPlayer, faction: Faction): string[] => {
// If player has a gang with this faction, return (almost) all augmentations
if (player.hasGangWith(faction.name)) {
let augs = Object.values(Augmentations);
// Remove special augs
augs = augs.filter((a) => !a.isSpecial);
const blacklist: string[] = [AugmentationNames.NeuroFluxGovernor];
if (player.bitNodeN !== 2) {
// TRP is not available outside of BN2 for Gangs
blacklist.push(AugmentationNames.TheRedPill);
}
const rng = SFC32RNG(`BN${player.bitNodeN}.${player.sourceFileLvl(player.bitNodeN)}`);
// Remove faction-unique augs that don't belong to this faction
const uniqueFilter = (a: Augmentation): boolean => {
// Keep all the non-unique one
if (a.factions.length > 1) {
return true;
}
// Keep all the ones that this faction has anyway.
if (faction.augmentations.includes(a.name)) {
return true;
}
return rng() >= 1 - BitNodeMultipliers.GangUniqueAugs;
};
augs = augs.filter(uniqueFilter);
// Remove blacklisted augs
augs = augs.filter((a) => !blacklist.includes(a.name));
return augs.map((a) => a.name);
}
return faction.augmentations.slice();
};

@ -10,7 +10,7 @@ import { AugmentationNames } from "../../Augmentation/data/AugmentationNames";
import { Faction } from "../Faction";
import { PurchaseAugmentationsOrderSetting } from "../../Settings/SettingEnums";
import { Settings } from "../../Settings/Settings";
import { hasAugmentationPrereqs } from "../FactionHelpers";
import { hasAugmentationPrereqs, getFactionAugmentationsFiltered } from "../FactionHelpers";
import { use } from "../../ui/Context";
import { Reputation } from "../../ui/React/Reputation";
@ -23,7 +23,7 @@ import Typography from "@mui/material/Typography";
import Tooltip from "@mui/material/Tooltip";
import TableBody from "@mui/material/TableBody";
import Table from "@mui/material/Table";
import { CONSTANTS } from "../../Constants";
import { getGenericAugmentationPriceMultiplier } from "../../Augmentation/AugmentationHelpers";
type IProps = {
faction: Faction;
@ -42,25 +42,7 @@ export function AugmentationsPage(props: IProps): React.ReactElement {
}
function getAugs(): string[] {
if (isPlayersGang) {
let augs = Object.values(Augmentations);
// Remove blacklisted augs.
const blacklist = [AugmentationNames.NeuroFluxGovernor, AugmentationNames.TheRedPill];
augs = augs.filter((a) => !blacklist.includes(a.name));
// Remove special augs.
augs = augs.filter((a) => !a.isSpecial);
// Remove faction-unique augs outside BN2. (But keep the one for this faction.)
if (player.bitNodeN !== 2) {
augs = augs.filter((a) => a.factions.length > 1 || props.faction.augmentations.includes(a.name));
}
return augs.map((a) => a.name);
} else {
return props.faction.augmentations.slice();
}
return getFactionAugmentationsFiltered(player, props.faction);
}
function getAugsSorted(): string[] {
@ -184,10 +166,7 @@ export function AugmentationsPage(props: IProps): React.ReactElement {
</>
);
}
const mult = Math.pow(
CONSTANTS.MultipleAugMultiplier * [1, 0.96, 0.94, 0.93][player.sourceFileLvl(11)],
player.queuedAugmentations.length,
);
return (
<>
<Button onClick={props.routeToMainPage}>Back</Button>
@ -208,7 +187,9 @@ export function AugmentationsPage(props: IProps): React.ReactElement {
</Typography>
}
>
<Typography>Price multiplier: x {numeralWrapper.formatMultiplier(mult)}</Typography>
<Typography>
Price multiplier: x {numeralWrapper.formatMultiplier(getGenericAugmentationPriceMultiplier())}
</Typography>
</Tooltip>
</Box>
<Button onClick={() => switchSortOrder(PurchaseAugmentationsOrderSetting.Cost)}>Sort by Cost</Button>

@ -9,7 +9,7 @@ import { Table, TableCell } from "../../ui/React/Table";
import { IRouter } from "../../ui/Router";
import { Faction } from "../Faction";
import { joinFaction } from "../FactionHelpers";
import { joinFaction, getFactionAugmentationsFiltered } from "../FactionHelpers";
import { Factions } from "../Factions";
import { FactionNames } from "../data/FactionNames";
@ -52,26 +52,7 @@ export function FactionsRoot(props: IProps): React.ReactElement {
}
const getAugsLeft = (faction: Faction, player: IPlayer): number => {
const isPlayersGang = player.inGang() && player.getGangName() === faction.name;
let augs: string[] = [];
if (isPlayersGang) {
for (const augName of Object.keys(Augmentations)) {
const aug = Augmentations[augName];
if (
augName === AugmentationNames.NeuroFluxGovernor ||
(augName === AugmentationNames.TheRedPill && player.bitNodeN !== 2) ||
// Special augs (i.e. Bladeburner augs)
aug.isSpecial ||
// Exclusive augs (i.e. QLink)
(aug.factions.length <= 1 && !faction.augmentations.includes(augName) && player.bitNodeN !== 2)
)
continue;
augs.push(augName);
}
} else {
augs = faction.augmentations.slice();
}
const augs = getFactionAugmentationsFiltered(player, faction);
return augs.filter((augmentation: string) => !player.hasAugmentation(augmentation)).length;
};

@ -227,7 +227,6 @@ export class Gang implements IGang {
AllGangs[thisGang].territory += territoryGain;
if (AllGangs[thisGang].territory > 0.999) AllGangs[thisGang].territory = 1;
AllGangs[otherGang].territory -= territoryGain;
if (AllGangs[thisGang].territory) AllGangs[thisGang].territory = 0;
if (thisGang === gangName) {
this.clash(true); // Player won
AllGangs[otherGang].power *= 1 / 1.01;

@ -7,6 +7,7 @@ import { random } from "../utils";
import { interpolate } from "./Difficulty";
import { BlinkingCursor } from "./BlinkingCursor";
import Typography from "@mui/material/Typography";
import { KEY } from "../../utils/helpers/keyCodes";
interface Difficulty {
[key: string]: number;
@ -36,7 +37,7 @@ export function BackwardGame(props: IMinigameProps): React.ReactElement {
function press(this: Document, event: KeyboardEvent): void {
event.preventDefault();
if (event.key === "Backspace") return;
if (event.key === KEY.BACKSPACE) return;
const nextGuess = guess + event.key.toUpperCase();
if (!answer.startsWith(nextGuess)) props.onFailure();
else if (answer === nextGuess) props.onSuccess();

@ -7,6 +7,7 @@ import { random } from "../utils";
import { interpolate } from "./Difficulty";
import { BlinkingCursor } from "./BlinkingCursor";
import Typography from "@mui/material/Typography";
import { KEY } from "../../utils/helpers/keyCodes";
interface Difficulty {
[key: string]: number;
@ -29,28 +30,29 @@ const difficulties: {
function generateLeftSide(difficulty: Difficulty): string {
let str = "";
const options = [KEY.OPEN_BRACKET, KEY.LESS_THAN, KEY.OPEN_PARENTHESIS, KEY.OPEN_BRACE];
const length = random(difficulty.min, difficulty.max);
for (let i = 0; i < length; i++) {
str += ["[", "<", "(", "{"][Math.floor(Math.random() * 4)];
str += options[Math.floor(Math.random() * 4)];
}
return str;
}
function getChar(event: KeyboardEvent): string {
if (event.key === ")") return ")";
if (event.key === "]") return "]";
if (event.key === "}") return "}";
if (event.key === ">") return ">";
if (event.key === KEY.CLOSE_PARENTHESIS) return KEY.CLOSE_PARENTHESIS;
if (event.key === KEY.CLOSE_BRACKET) return KEY.CLOSE_BRACKET;
if (event.key === KEY.CLOSE_BRACE) return KEY.CLOSE_BRACE;
if (event.key === KEY.GREATER_THAN) return KEY.GREATER_THAN;
return "";
}
function match(left: string, right: string): boolean {
return (
(left === "[" && right === "]") ||
(left === "<" && right === ">") ||
(left === "(" && right === ")") ||
(left === "{" && right === "}")
(left === KEY.OPEN_BRACKET && right === KEY.CLOSE_BRACKET) ||
(left === KEY.LESS_THAN && right === KEY.GREATER_THAN) ||
(left === KEY.OPEN_PARENTHESIS && right === KEY.CLOSE_PARENTHESIS) ||
(left === KEY.OPEN_BRACE && right === KEY.CLOSE_BRACE)
);
}

@ -5,6 +5,8 @@ import { KeyHandler } from "./KeyHandler";
import { GameTimer } from "./GameTimer";
import { interpolate } from "./Difficulty";
import Typography from "@mui/material/Typography";
import { KEY } from "../../utils/helpers/keyCodes";
import { downArrowSymbol, upArrowSymbol } from "../utils";
interface Difficulty {
[key: string]: number;
@ -34,15 +36,15 @@ export function BribeGame(props: IMinigameProps): React.ReactElement {
function press(this: Document, event: KeyboardEvent): void {
event.preventDefault();
const k = event.key;
if (k === " ") {
if (k === KEY.SPACE) {
if (positive.includes(choices[index])) props.onSuccess();
else props.onFailure();
return;
}
let newIndex = index;
if (["ArrowUp", "w", "ArrowRight", "d"].includes(k)) newIndex++;
if (["ArrowDown", "s", "ArrowLeft", "a"].includes(k)) newIndex--;
if ([KEY.UP_ARROW, KEY.W, KEY.RIGHT_ARROW, KEY.D].map((key) => key as string).includes(k)) newIndex++;
if ([KEY.DOWN_ARROW, KEY.S, KEY.LEFT_ARROW, KEY.A].map((key) => key as string).includes(k)) newIndex--;
while (newIndex < 0) newIndex += choices.length;
while (newIndex > choices.length - 1) newIndex -= choices.length;
setIndex(newIndex);
@ -57,13 +59,13 @@ export function BribeGame(props: IMinigameProps): React.ReactElement {
</Grid>
<Grid item xs={6}>
<Typography variant="h5" color="primary">
{upArrowSymbol}
</Typography>
<Typography variant="h5" color="primary">
{choices[index]}
</Typography>
<Typography variant="h5" color="primary">
{downArrowSymbol}
</Typography>
</Grid>
</Grid>

@ -3,7 +3,7 @@ import Grid from "@mui/material/Grid";
import { IMinigameProps } from "./IMinigameProps";
import { KeyHandler } from "./KeyHandler";
import { GameTimer } from "./GameTimer";
import { random, getArrow } from "../utils";
import { random, getArrow, rightArrowSymbol, leftArrowSymbol, upArrowSymbol, downArrowSymbol } from "../utils";
import { interpolate } from "./Difficulty";
import Typography from "@mui/material/Typography";
@ -56,7 +56,7 @@ export function CheatCodeGame(props: IMinigameProps): React.ReactElement {
}
function generateCode(difficulty: Difficulty): string {
const arrows = ["←", "→", "↑", "↓"];
const arrows = [leftArrowSymbol, rightArrowSymbol, upArrowSymbol, downArrowSymbol];
let code = "";
for (let i = 0; i < random(difficulty.min, difficulty.max); i++) {
let arrow = arrows[Math.floor(4 * Math.random())];

@ -4,8 +4,9 @@ import { IMinigameProps } from "./IMinigameProps";
import { KeyHandler } from "./KeyHandler";
import { GameTimer } from "./GameTimer";
import { interpolate } from "./Difficulty";
import { getArrow } from "../utils";
import { downArrowSymbol, getArrow, leftArrowSymbol, rightArrowSymbol, upArrowSymbol } from "../utils";
import Typography from "@mui/material/Typography";
import { KEY } from "../../utils/helpers/keyCodes";
interface Difficulty {
[key: string]: number;
@ -41,16 +42,16 @@ export function Cyberpunk2077Game(props: IMinigameProps): React.ReactElement {
const move = [0, 0];
const arrow = getArrow(event);
switch (arrow) {
case "↑":
case upArrowSymbol:
move[1]--;
break;
case "←":
case leftArrowSymbol:
move[0]--;
break;
case "↓":
case downArrowSymbol:
move[1]++;
break;
case "→":
case rightArrowSymbol:
move[0]++;
break;
}
@ -59,7 +60,7 @@ export function Cyberpunk2077Game(props: IMinigameProps): React.ReactElement {
next[1] = (next[1] + grid.length) % grid.length;
setPos(next);
if (event.key === " ") {
if (event.key === KEY.SPACE) {
const selected = grid[pos[1]][pos[0]];
const expected = answer[index];
if (selected !== expected) {

@ -4,8 +4,9 @@ import { IMinigameProps } from "./IMinigameProps";
import { KeyHandler } from "./KeyHandler";
import { GameTimer } from "./GameTimer";
import { interpolate } from "./Difficulty";
import { getArrow } from "../utils";
import { downArrowSymbol, getArrow, leftArrowSymbol, rightArrowSymbol, upArrowSymbol } from "../utils";
import Typography from "@mui/material/Typography";
import { KEY } from "../../utils/helpers/keyCodes";
interface Difficulty {
[key: string]: number;
@ -42,16 +43,16 @@ export function MinesweeperGame(props: IMinigameProps): React.ReactElement {
const move = [0, 0];
const arrow = getArrow(event);
switch (arrow) {
case "↑":
case upArrowSymbol:
move[1]--;
break;
case "←":
case leftArrowSymbol:
move[0]--;
break;
case "↓":
case downArrowSymbol:
move[1]++;
break;
case "→":
case rightArrowSymbol:
move[0]++;
break;
}
@ -60,7 +61,7 @@ export function MinesweeperGame(props: IMinigameProps): React.ReactElement {
next[1] = (next[1] + minefield.length) % minefield.length;
setPos(next);
if (event.key == " ") {
if (event.key == KEY.SPACE) {
if (!minefield[pos[1]][pos[0]]) {
props.onFailure();
return;

@ -5,6 +5,7 @@ import { KeyHandler } from "./KeyHandler";
import { GameTimer } from "./GameTimer";
import { interpolate } from "./Difficulty";
import Typography from "@mui/material/Typography";
import { KEY } from "../../utils/helpers/keyCodes";
interface Difficulty {
[key: string]: number;
@ -30,7 +31,7 @@ export function SlashGame(props: IMinigameProps): React.ReactElement {
function press(this: Document, event: KeyboardEvent): void {
event.preventDefault();
if (event.key !== " ") return;
if (event.key !== KEY.SPACE) return;
if (phase !== 2) {
props.onFailure();
} else {

@ -6,6 +6,7 @@ import { KeyHandler } from "./KeyHandler";
import { GameTimer } from "./GameTimer";
import { random } from "../utils";
import { interpolate } from "./Difficulty";
import { KEY } from "../../utils/helpers/keyCodes";
interface Difficulty {
[key: string]: number;
@ -27,7 +28,7 @@ const difficulties: {
Impossible: { timer: 4000, wiresmin: 9, wiresmax: 9, rules: 4 },
};
const types = ["|", ".", "/", "-", "█", "#"];
const types = [KEY.PIPE, KEY.DOT, KEY.FORWARD_SLASH, KEY.HYPHEN, "█", KEY.HASH];
const colors = ["red", "#FFC107", "blue", "white"];
@ -61,6 +62,10 @@ export function WireCuttingGame(props: IMinigameProps): React.ReactElement {
const [cutWires, setCutWires] = useState(new Array(wires.length).fill(false));
const [questions] = useState(generateQuestion(wires, difficulty));
function checkWire(wireNum: number): boolean {
return !questions.some((q) => q.shouldCut(wires[wireNum - 1], wireNum - 1));
}
function press(this: Document, event: KeyboardEvent): void {
event.preventDefault();
const wireNum = parseInt(event.key);
@ -69,7 +74,7 @@ export function WireCuttingGame(props: IMinigameProps): React.ReactElement {
setCutWires((old) => {
const next = [...old];
next[wireNum - 1] = true;
if (!questions.some((q) => q.shouldCut(wires[wireNum - 1], wireNum - 1))) {
if (checkWire(wireNum)) {
props.onFailure();
}

@ -1,21 +1,46 @@
import { KEY } from "../utils/helpers/keyCodes";
export function random(min: number, max: number): number {
return Math.random() * (max - min) + min;
}
export const upArrowSymbol = "↑";
export const downArrowSymbol = "↓";
export const leftArrowSymbol = "←";
export const rightArrowSymbol = "→";
export function getArrow(event: KeyboardEvent): string {
switch (event.key) {
case "ArrowUp":
case "w":
return "↑";
case "ArrowLeft":
case "a":
return "←";
case "ArrowDown":
case "s":
return "↓";
case "ArrowRight":
case "d":
return "→";
case KEY.UP_ARROW:
case KEY.W:
return upArrowSymbol;
case KEY.LEFT_ARROW:
case KEY.A:
return leftArrowSymbol;
case KEY.DOWN_ARROW:
case KEY.S:
return downArrowSymbol;
case KEY.RIGHT_ARROW:
case KEY.D:
return rightArrowSymbol;
}
return "";
}
export function getInverseArrow(event: KeyboardEvent): string {
switch (event.key) {
case KEY.DOWN_ARROW:
case KEY.S:
return upArrowSymbol;
case KEY.RIGHT_ARROW:
case KEY.D:
return leftArrowSymbol;
case KEY.UP_ARROW:
case KEY.W:
return downArrowSymbol;
case KEY.LEFT_ARROW:
case KEY.A:
return rightArrowSymbol;
}
return "";
}

@ -136,6 +136,7 @@ export const RamCosts: IMap<any> = {
kill: RamCostConstants.ScriptKillRamCost,
killall: RamCostConstants.ScriptKillRamCost,
exit: 0,
atExit: 0,
scp: RamCostConstants.ScriptScpRamCost,
ls: RamCostConstants.ScriptScanRamCost,
ps: RamCostConstants.ScriptScanRamCost,
@ -364,16 +365,16 @@ export const RamCosts: IMap<any> = {
},
stanek: {
width: RamCostConstants.ScriptStanekWidth,
height: RamCostConstants.ScriptStanekHeight,
charge: RamCostConstants.ScriptStanekCharge,
giftWidth: RamCostConstants.ScriptStanekWidth,
giftHeight: RamCostConstants.ScriptStanekHeight,
chargeFragment: RamCostConstants.ScriptStanekCharge,
fragmentDefinitions: RamCostConstants.ScriptStanekFragmentDefinitions,
activeFragments: RamCostConstants.ScriptStanekPlacedFragments,
clear: RamCostConstants.ScriptStanekClear,
canPlace: RamCostConstants.ScriptStanekCanPlace,
place: RamCostConstants.ScriptStanekPlace,
get: RamCostConstants.ScriptStanekFragmentAt,
remove: RamCostConstants.ScriptStanekDeleteAt,
clearGift: RamCostConstants.ScriptStanekClear,
canPlaceFragment: RamCostConstants.ScriptStanekCanPlace,
placeFragment: RamCostConstants.ScriptStanekPlace,
getFragment: RamCostConstants.ScriptStanekFragmentAt,
removeFragment: RamCostConstants.ScriptStanekDeleteAt,
},
ui: {
@ -387,8 +388,8 @@ export const RamCosts: IMap<any> = {
},
grafting: {
getAugmentationCraftPrice: 3.75,
getAugmentationCraftTime: 3.75,
getAugmentationGraftPrice: 3.75,
getAugmentationGraftTime: 3.75,
graftAugmentation: 7.5,
},

@ -80,6 +80,13 @@ import {
Bladeburner as IBladeburner,
Stanek as IStanek,
SourceFileLvl,
BasicHGWOptions,
ProcessInfo,
HackingMultipliers,
HacknetMultipliers,
BitNodeMultipliers as IBNMults,
Server as IServerDef,
RunningScript as IRunningScriptDef,
} from "./ScriptEditor/NetscriptDefinitions";
import { NetscriptSingularity } from "./NetscriptFunctions/Singularity";
@ -91,6 +98,7 @@ import { SnackbarEvents } from "./ui/React/Snackbar";
import { Flags } from "./NetscriptFunctions/Flags";
import { calculateIntelligenceBonus } from "./PersonObjects/formulas/intelligence";
import { CalculateShareMult, StartSharing } from "./NetworkShare/Share";
import { CityName } from "./Locations/data/CityNames";
interface NS extends INS {
[key: string]: any;
@ -162,9 +170,9 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
* is not specified.
*/
const getRunningScript = function (
fn: any,
hostname: any,
callingFnName: any,
fn: string,
hostname: string,
callingFnName: string,
scriptArgs: any,
): RunningScript | null {
if (typeof callingFnName !== "string" || callingFnName === "") {
@ -193,7 +201,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return workerScript.scriptRef;
};
const getRunningScriptByPid = function (pid: any, callingFnName: any): RunningScript | null {
const getRunningScriptByPid = function (pid: number, callingFnName: string): RunningScript | null {
if (typeof callingFnName !== "string" || callingFnName === "") {
callingFnName = "getRunningScriptgetRunningScriptByPid";
}
@ -213,7 +221,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
* @param {any[]} scriptArgs - Running script's arguments
* @returns {string} Error message to print to logs
*/
const getCannotFindRunningScriptErrorMessage = function (fn: any, hostname: any, scriptArgs: any): string {
const getCannotFindRunningScriptErrorMessage = function (fn: string, hostname: string, scriptArgs: any): string {
if (!Array.isArray(scriptArgs)) {
scriptArgs = [];
}
@ -228,7 +236,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
* @param {string} callingFn - Name of calling function. For logging purposes
* @returns {boolean} True if the server is a Hacknet Server, false otherwise
*/
const failOnHacknetServer = function (server: any, callingFn: any = ""): boolean {
const failOnHacknetServer = function (server: BaseServer, callingFn = ""): boolean {
if (server instanceof HacknetServer) {
workerScript.log(callingFn, () => `Does not work on Hacknet Servers`);
return true;
@ -316,7 +324,11 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
}
};
const hack = function (hostname: any, manual: any, { threads: requestedThreads, stock }: any = {}): Promise<number> {
const hack = function (
hostname: string,
manual: boolean,
{ threads: requestedThreads, stock }: any = {},
): Promise<number> {
if (hostname === undefined) {
throw makeRuntimeErrorMsg("hack", "Takes 1 argument.");
}
@ -429,25 +441,32 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
string: (funcName: string, argName: string, v: unknown): string => {
if (typeof v === "string") return v;
if (typeof v === "number") return v + ""; // cast to string;
throw makeRuntimeErrorMsg(funcName, `${argName} should be a string`);
throw makeRuntimeErrorMsg(funcName, `${argName} should be a string.`);
},
number: (funcName: string, argName: string, v: unknown): number => {
if (typeof v === "string") {
const x = parseFloat(v);
if (!isNaN(x)) return x; // otherwise it wasn't even a string representing a number.
} else if (typeof v === "number") {
if (isNaN(v)) throw makeRuntimeErrorMsg(funcName, `${argName} is NaN`);
if (isNaN(v)) throw makeRuntimeErrorMsg(funcName, `${argName} is NaN.`);
return v;
}
throw makeRuntimeErrorMsg(funcName, `${argName} should be a number`);
throw makeRuntimeErrorMsg(funcName, `${argName} should be a number.`);
},
boolean: (v: unknown): boolean => {
return !!v; // Just convert it to boolean.
},
city: (funcName: string, argName: string, v: unknown): CityName => {
if (typeof v !== "string") throw makeRuntimeErrorMsg(funcName, `${argName} should be a city name.`);
const s = v as CityName;
if (!Object.values(CityName).includes(s))
throw makeRuntimeErrorMsg(funcName, `${argName} should be a city name.`);
return s;
},
getServer: safeGetServer,
checkSingularityAccess: checkSingularityAccess,
hack: hack,
getValidPort: (funcName: string, port: any): IPort => {
getValidPort: (funcName: string, port: number): IPort => {
if (isNaN(port)) {
throw makeRuntimeErrorMsg(
funcName,
@ -486,6 +505,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
const base: INS = {
...singularity,
singularity: singularity,
gang: gang,
bladeburner: bladeburner,
codingcontract: codingcontract,
@ -500,7 +520,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
hacknet: hacknet,
sprintf: sprintf,
vsprintf: vsprintf,
scan: function (hostname: any = workerScript.hostname): any {
scan: function (_hostname: unknown = workerScript.hostname): string[] {
const hostname = helper.string("scan", "hostname", _hostname);
updateDynamicRam("scan", getRamCost(Player, "scan"));
const server = safeGetServer(hostname, "scan");
const out = [];
@ -514,11 +535,14 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
workerScript.log("scan", () => `returned ${server.serversOnNetwork.length} connections for ${server.hostname}`);
return out;
},
hack: function (hostname: any, { threads: requestedThreads, stock }: any = {}): any {
hack: function (_hostname: unknown, { threads: requestedThreads, stock }: BasicHGWOptions = {}): Promise<number> {
const hostname = helper.string("hack", "hostname", _hostname);
updateDynamicRam("hack", getRamCost(Player, "hack"));
return hack(hostname, false, { threads: requestedThreads, stock: stock });
},
hackAnalyzeThreads: function (hostname: any, hackAmount: any): any {
hackAnalyzeThreads: function (_hostname: unknown, _hackAmount: unknown): number {
const hostname = helper.string("hackAnalyzeThreads", "hostname", _hostname);
const hackAmount = helper.number("hackAnalyzeThreads", "hackAmount", _hackAmount);
updateDynamicRam("hackAnalyzeThreads", getRamCost(Player, "hackAnalyzeThreads"));
// Check argument validity
@ -548,43 +572,48 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return hackAmount / Math.floor(server.moneyAvailable * percentHacked);
},
hackAnalyze: function (hostname: any): any {
hackAnalyze: function (_hostname: unknown): number {
const hostname = helper.string("hackAnalyze", "hostname", _hostname);
updateDynamicRam("hackAnalyze", getRamCost(Player, "hackAnalyze"));
const server = safeGetServer(hostname, "hackAnalyze");
if (!(server instanceof Server)) {
workerScript.log("hackAnalyze", () => "Cannot be executed on this server.");
return false;
return 0;
}
return calculatePercentMoneyHacked(server, Player);
},
hackAnalyzeSecurity: function (threads: any): number {
hackAnalyzeSecurity: function (_threads: unknown): number {
const threads = helper.number("hackAnalyzeSecurity", "threads", _threads);
updateDynamicRam("hackAnalyzeSecurity", getRamCost(Player, "hackAnalyzeSecurity"));
return CONSTANTS.ServerFortifyAmount * threads;
},
hackAnalyzeChance: function (hostname: any): any {
hackAnalyzeChance: function (_hostname: unknown): number {
const hostname = helper.string("hackAnalyzeChance", "hostname", _hostname);
updateDynamicRam("hackAnalyzeChance", getRamCost(Player, "hackAnalyzeChance"));
const server = safeGetServer(hostname, "hackAnalyzeChance");
if (!(server instanceof Server)) {
workerScript.log("hackAnalyzeChance", () => "Cannot be executed on this server.");
return false;
return 0;
}
return calculateHackingChance(server, Player);
},
sleep: function (time: any): any {
sleep: async function (_time: unknown = 0): Promise<void> {
const time = helper.number("sleep", "time", _time);
updateDynamicRam("sleep", getRamCost(Player, "sleep"));
if (time === undefined) {
throw makeRuntimeErrorMsg("sleep", "Takes 1 argument.");
}
workerScript.log("sleep", () => `Sleeping for ${time} milliseconds`);
return netscriptDelay(time, workerScript).then(function () {
return Promise.resolve(true);
return Promise.resolve();
});
},
asleep: function (time: any): any {
asleep: function (_time: unknown = 0): Promise<void> {
const time = helper.number("asleep", "time", _time);
updateDynamicRam("asleep", getRamCost(Player, "asleep"));
if (time === undefined) {
throw makeRuntimeErrorMsg("asleep", "Takes 1 argument.");
@ -592,16 +621,24 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
workerScript.log("asleep", () => `Sleeping for ${time} milliseconds`);
return new Promise((resolve) => setTimeout(resolve, time));
},
grow: function (hostname: any, { threads: requestedThreads, stock }: any = {}): any {
grow: async function (
_hostname: unknown,
{ threads: requestedThreads, stock }: BasicHGWOptions = {},
): Promise<number> {
const hostname = helper.string("grow", "hostname", _hostname);
updateDynamicRam("grow", getRamCost(Player, "grow"));
const threads = resolveNetscriptRequestedThreads(workerScript, "grow", requestedThreads);
const threads = resolveNetscriptRequestedThreads(
workerScript,
"grow",
requestedThreads ?? workerScript.scriptRef.threads,
);
if (hostname === undefined) {
throw makeRuntimeErrorMsg("grow", "Takes 1 argument.");
}
const server = safeGetServer(hostname, "grow");
if (!(server instanceof Server)) {
workerScript.log("grow", () => "Cannot be executed on this server.");
return false;
return Promise.resolve(0);
}
const host = GetServer(workerScript.hostname);
@ -647,14 +684,17 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return Promise.resolve(moneyAfter / moneyBefore);
});
},
growthAnalyze: function (hostname: any, growth: any, cores: any = 1): any {
growthAnalyze: function (_hostname: unknown, _growth: unknown, _cores: unknown = 1): number {
const hostname = helper.string("growthAnalyze", "hostname", _hostname);
const growth = helper.number("growthAnalyze", "growth", _growth);
const cores = helper.number("growthAnalyze", "cores", _cores);
updateDynamicRam("growthAnalyze", getRamCost(Player, "growthAnalyze"));
// Check argument validity
const server = safeGetServer(hostname, "growthAnalyze");
if (!(server instanceof Server)) {
workerScript.log("growthAnalyze", () => "Cannot be executed on this server.");
return false;
return 0;
}
if (typeof growth !== "number" || isNaN(growth) || growth < 1 || !isFinite(growth)) {
throw makeRuntimeErrorMsg("growthAnalyze", `Invalid argument: growth must be numeric and >= 1, is ${growth}.`);
@ -662,20 +702,26 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return numCycleForGrowth(server, Number(growth), Player, cores);
},
growthAnalyzeSecurity: function (threads: any): number {
growthAnalyzeSecurity: function (_threads: unknown): number {
const threads = helper.number("growthAnalyzeSecurity", "threads", _threads);
updateDynamicRam("growthAnalyzeSecurity", getRamCost(Player, "growthAnalyzeSecurity"));
return 2 * CONSTANTS.ServerFortifyAmount * threads;
},
weaken: function (hostname: any, { threads: requestedThreads }: any = {}): any {
weaken: async function (_hostname: unknown, { threads: requestedThreads }: BasicHGWOptions = {}): Promise<number> {
const hostname = helper.string("weaken", "hostname", _hostname);
updateDynamicRam("weaken", getRamCost(Player, "weaken"));
const threads = resolveNetscriptRequestedThreads(workerScript, "weaken", requestedThreads);
const threads = resolveNetscriptRequestedThreads(
workerScript,
"weaken",
requestedThreads ?? workerScript.scriptRef.threads,
);
if (hostname === undefined) {
throw makeRuntimeErrorMsg("weaken", "Takes 1 argument.");
}
const server = safeGetServer(hostname, "weaken");
if (!(server instanceof Server)) {
workerScript.log("weaken", () => "Cannot be executed on this server.");
return false;
return Promise.resolve(0);
}
// No root access or skill level too low
@ -715,12 +761,14 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return Promise.resolve(CONSTANTS.ServerWeakenAmount * threads * coreBonus);
});
},
weakenAnalyze: function (threads: any, cores: any = 1): number {
weakenAnalyze: function (_threads: unknown, _cores: unknown = 1): number {
const threads = helper.number("weakenAnalyze", "threads", _threads);
const cores = helper.number("weakenAnalyze", "cores", _cores);
updateDynamicRam("weakenAnalyze", getRamCost(Player, "weakenAnalyze"));
const coreBonus = 1 + (cores - 1) / 16;
return CONSTANTS.ServerWeakenAmount * threads * coreBonus * BitNodeMultipliers.ServerWeakenRate;
},
share: function (): Promise<void> {
share: async function (): Promise<void> {
updateDynamicRam("share", getRamCost(Player, "share"));
workerScript.log("share", () => "Sharing this computer.");
const end = StartSharing(workerScript.scriptRef.threads * calculateIntelligenceBonus(Player.intelligence, 2));
@ -740,7 +788,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
}
workerScript.print(argsToString(args));
},
printf: function (format: string, ...args: any[]): void {
printf: function (_format: unknown, ...args: any[]): void {
const format = helper.string("printf", "format", _format);
updateDynamicRam("printf", getRamCost(Player, "printf"));
if (typeof format !== "string") {
throw makeRuntimeErrorMsg("printf", "First argument must be string for the format.");
@ -771,7 +820,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
}
Terminal.print(`${workerScript.scriptRef.filename}: ${str}`);
},
tprintf: function (format: any, ...args: any): any {
tprintf: function (_format: unknown, ...args: any[]): void {
const format = helper.string("printf", "format", _format);
updateDynamicRam("tprintf", getRamCost(Player, "tprintf"));
if (typeof format !== "string") {
throw makeRuntimeErrorMsg("tprintf", "First argument must be string for the format.");
@ -796,14 +846,15 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
}
Terminal.print(`${str}`);
},
clearLog: function (): any {
clearLog: function (): void {
updateDynamicRam("clearLog", getRamCost(Player, "clearLog"));
workerScript.scriptRef.clearLog();
},
disableLog: function (fn: any): any {
disableLog: function (_fn: unknown): void {
const fn = helper.string("disableLog", "fn", _fn);
updateDynamicRam("disableLog", getRamCost(Player, "disableLog"));
if (fn === "ALL") {
for (fn of Object.keys(possibleLogs)) {
for (const fn of Object.keys(possibleLogs)) {
workerScript.disableLogs[fn] = true;
}
workerScript.log("disableLog", () => `Disabled logging for all functions`);
@ -814,10 +865,11 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
workerScript.log("disableLog", () => `Disabled logging for ${fn}`);
}
},
enableLog: function (fn: any): any {
enableLog: function (_fn: unknown): void {
const fn = helper.string("enableLog", "fn", _fn);
updateDynamicRam("enableLog", getRamCost(Player, "enableLog"));
if (fn === "ALL") {
for (fn of Object.keys(possibleLogs)) {
for (const fn of Object.keys(possibleLogs)) {
delete workerScript.disableLogs[fn];
}
workerScript.log("enableLog", () => `Enabled logging for all functions`);
@ -827,24 +879,25 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
delete workerScript.disableLogs[fn];
workerScript.log("enableLog", () => `Enabled logging for ${fn}`);
},
isLogEnabled: function (fn: any): any {
isLogEnabled: function (_fn: unknown): boolean {
const fn = helper.string("isLogEnabled", "fn", _fn);
updateDynamicRam("isLogEnabled", getRamCost(Player, "isLogEnabled"));
if (possibleLogs[fn] === undefined) {
throw makeRuntimeErrorMsg("isLogEnabled", `Invalid argument: ${fn}.`);
}
return !workerScript.disableLogs[fn];
},
getScriptLogs: function (fn: any, hostname: any, ...scriptArgs: any): any {
getScriptLogs: function (fn: any, hostname: any, ...scriptArgs: any[]): string[] {
updateDynamicRam("getScriptLogs", getRamCost(Player, "getScriptLogs"));
const runningScriptObj = getRunningScript(fn, hostname, "getScriptLogs", scriptArgs);
if (runningScriptObj == null) {
workerScript.log("getScriptLogs", () => getCannotFindRunningScriptErrorMessage(fn, hostname, scriptArgs));
return "";
return [];
}
return runningScriptObj.logs.slice();
},
tail: function (fn: any, hostname: any = workerScript.hostname, ...scriptArgs: any): any {
tail: function (fn: any, hostname: any = workerScript.hostname, ...scriptArgs: any[]): void {
updateDynamicRam("tail", getRamCost(Player, "tail"));
let runningScriptObj;
if (arguments.length === 0) {
@ -861,7 +914,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
LogBoxEvents.emit(runningScriptObj);
},
nuke: function (hostname: any): boolean {
nuke: function (_hostname: unknown): boolean {
const hostname = helper.string("tail", "hostname", _hostname);
updateDynamicRam("nuke", getRamCost(Player, "nuke"));
if (hostname === undefined) {
throw makeRuntimeErrorMsg("nuke", "Takes 1 argument.");
@ -885,7 +939,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
workerScript.log("nuke", () => `Executed NUKE.exe virus on '${server.hostname}' to gain root access.`);
return true;
},
brutessh: function (hostname: any): boolean {
brutessh: function (_hostname: unknown): boolean {
const hostname = helper.string("brutessh", "hostname", _hostname);
updateDynamicRam("brutessh", getRamCost(Player, "brutessh"));
if (hostname === undefined) {
throw makeRuntimeErrorMsg("brutessh", "Takes 1 argument.");
@ -907,7 +962,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
}
return true;
},
ftpcrack: function (hostname: any): boolean {
ftpcrack: function (_hostname: unknown): boolean {
const hostname = helper.string("ftpcrack", "hostname", _hostname);
updateDynamicRam("ftpcrack", getRamCost(Player, "ftpcrack"));
if (hostname === undefined) {
throw makeRuntimeErrorMsg("ftpcrack", "Takes 1 argument.");
@ -929,7 +985,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
}
return true;
},
relaysmtp: function (hostname: any): boolean {
relaysmtp: function (_hostname: unknown): boolean {
const hostname = helper.string("relaysmtp", "hostname", _hostname);
updateDynamicRam("relaysmtp", getRamCost(Player, "relaysmtp"));
if (hostname === undefined) {
throw makeRuntimeErrorMsg("relaysmtp", "Takes 1 argument.");
@ -951,7 +1008,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
}
return true;
},
httpworm: function (hostname: any): boolean {
httpworm: function (_hostname: unknown): boolean {
const hostname = helper.string("httpworm", "hostname", _hostname);
updateDynamicRam("httpworm", getRamCost(Player, "httpworm"));
if (hostname === undefined) {
throw makeRuntimeErrorMsg("httpworm", "Takes 1 argument");
@ -973,7 +1031,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
}
return true;
},
sqlinject: function (hostname: any): boolean {
sqlinject: function (_hostname: unknown): boolean {
const hostname = helper.string("sqlinject", "hostname", _hostname);
updateDynamicRam("sqlinject", getRamCost(Player, "sqlinject"));
if (hostname === undefined) {
throw makeRuntimeErrorMsg("sqlinject", "Takes 1 argument.");
@ -995,7 +1054,9 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
}
return true;
},
run: function (scriptname: any, threads: any = 1, ...args: any[]): any {
run: function (_scriptname: unknown, _threads: unknown = 1, ...args: any[]): number {
const scriptname = helper.string("run", "scriptname", _scriptname);
const threads = helper.number("run", "threads", _threads);
updateDynamicRam("run", getRamCost(Player, "run"));
if (scriptname === undefined) {
throw makeRuntimeErrorMsg("run", "Usage: run(scriptname, [numThreads], [arg1], [arg2]...)");
@ -1010,7 +1071,10 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return runScriptFromScript(Player, "run", scriptServer, scriptname, args, workerScript, threads);
},
exec: function (scriptname: any, hostname: any, threads: any = 1, ...args: any[]): any {
exec: function (_scriptname: unknown, _hostname: unknown, _threads: unknown = 1, ...args: any[]): number {
const scriptname = helper.string("exec", "scriptname", _scriptname);
const hostname = helper.string("exec", "hostname", _hostname);
const threads = helper.number("exec", "threads", _threads);
updateDynamicRam("exec", getRamCost(Player, "exec"));
if (scriptname === undefined || hostname === undefined) {
throw makeRuntimeErrorMsg("exec", "Usage: exec(scriptname, server, [numThreads], [arg1], [arg2]...)");
@ -1021,7 +1085,9 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
const server = safeGetServer(hostname, "exec");
return runScriptFromScript(Player, "exec", server, scriptname, args, workerScript, threads);
},
spawn: function (scriptname: any, threads: any = 1, ...args: any[]): any {
spawn: function (_scriptname: unknown, _threads: unknown = 1, ...args: any[]): void {
const scriptname = helper.string("spawn", "scriptname", _scriptname);
const threads = helper.number("spawn", "threads", _threads);
updateDynamicRam("spawn", getRamCost(Player, "spawn"));
if (!scriptname || !threads) {
throw makeRuntimeErrorMsg("spawn", "Usage: spawn(scriptname, threads)");
@ -1047,7 +1113,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
workerScript.log("spawn", () => "Exiting...");
}
},
kill: function (filename: any, hostname?: any, ...scriptArgs: any): any {
kill: function (filename: any, hostname?: any, ...scriptArgs: any[]): boolean {
updateDynamicRam("kill", getRamCost(Player, "kill"));
let res;
@ -1093,7 +1159,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return false;
}
},
killall: function (hostname: any = workerScript.hostname): any {
killall: function (_hostname: unknown = workerScript.hostname): boolean {
const hostname = helper.string("killall", "hostname", _hostname);
updateDynamicRam("killall", getRamCost(Player, "killall"));
if (hostname === undefined) {
throw makeRuntimeErrorMsg("killall", "Takes 1 argument");
@ -1111,7 +1178,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return scriptsRunning;
},
exit: function (): any {
exit: function (): void {
updateDynamicRam("exit", getRamCost(Player, "exit"));
workerScript.running = false; // Prevent workerScript from "finishing execution naturally"
if (killWorkerScript(workerScript)) {
@ -1120,7 +1187,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
workerScript.log("exit", () => "Failed. This is a bug. Report to dev.");
}
},
scp: async function (scriptname: any, hostname1: any, hostname2?: any): Promise<boolean> {
scp: async function (scriptname: any, _hostname1: unknown, hostname2?: any): Promise<boolean> {
const hostname1 = helper.string("scp", "hostname1", _hostname1);
updateDynamicRam("scp", getRamCost(Player, "scp"));
if (arguments.length !== 2 && arguments.length !== 3) {
throw makeRuntimeErrorMsg("scp", "Takes 2 or 3 arguments");
@ -1277,7 +1345,9 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
newScript.updateRamUsage(Player, destServer.scripts).then(() => resolve(true));
});
},
ls: function (hostname: any, grep: any): any {
ls: function (_hostname: unknown, _grep: unknown = ""): string[] {
const hostname = helper.string("ls", "hostname", _hostname);
const grep = helper.string("ls", "grep", _grep);
updateDynamicRam("ls", getRamCost(Player, "ls"));
if (hostname === undefined) {
throw makeRuntimeErrorMsg("ls", "Usage: ls(hostname/ip, [grep filter])");
@ -1344,7 +1414,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
allFiles.sort();
return allFiles;
},
ps: function (hostname: any = workerScript.hostname): any {
ps: function (_hostname: unknown = workerScript.hostname): ProcessInfo[] {
const hostname = helper.string("ps", "hostname", _hostname);
updateDynamicRam("ps", getRamCost(Player, "ps"));
const server = safeGetServer(hostname, "ps");
const processes = [];
@ -1358,7 +1429,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
}
return processes;
},
hasRootAccess: function (hostname: any): any {
hasRootAccess: function (_hostname: unknown): boolean {
const hostname = helper.string("hasRootAccess", "hostname", _hostname);
updateDynamicRam("hasRootAccess", getRamCost(Player, "hasRootAccess"));
if (hostname === undefined) {
throw makeRuntimeErrorMsg("hasRootAccess", "Takes 1 argument");
@ -1366,7 +1438,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
const server = safeGetServer(hostname, "hasRootAccess");
return server.hasAdminRights;
},
getHostname: function (): any {
getHostname: function (): string {
updateDynamicRam("getHostname", getRamCost(Player, "getHostname"));
const scriptServer = GetServer(workerScript.hostname);
if (scriptServer == null) {
@ -1374,13 +1446,13 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
}
return scriptServer.hostname;
},
getHackingLevel: function (): any {
getHackingLevel: function (): number {
updateDynamicRam("getHackingLevel", getRamCost(Player, "getHackingLevel"));
Player.updateSkillLevels();
workerScript.log("getHackingLevel", () => `returned ${Player.hacking}`);
return Player.hacking;
},
getHackingMultipliers: function (): any {
getHackingMultipliers: function (): HackingMultipliers {
updateDynamicRam("getHackingMultipliers", getRamCost(Player, "getHackingMultipliers"));
return {
chance: Player.hacking_chance_mult,
@ -1389,7 +1461,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
growth: Player.hacking_grow_mult,
};
},
getHacknetMultipliers: function (): any {
getHacknetMultipliers: function (): HacknetMultipliers {
updateDynamicRam("getHacknetMultipliers", getRamCost(Player, "getHacknetMultipliers"));
return {
production: Player.hacknet_node_money_mult,
@ -1399,7 +1471,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
levelCost: Player.hacknet_node_level_cost_mult,
};
},
getBitNodeMultipliers: function (): any {
getBitNodeMultipliers: function (): IBNMults {
updateDynamicRam("getBitNodeMultipliers", getRamCost(Player, "getBitNodeMultipliers"));
if (SourceFileFlags[5] <= 0 && Player.bitNodeN !== 5) {
throw makeRuntimeErrorMsg("getBitNodeMultipliers", "Requires Source-File 5 to run.");
@ -1407,7 +1479,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
const copy = Object.assign({}, BitNodeMultipliers);
return copy;
},
getServer: function (hostname: any = workerScript.hostname): any {
getServer: function (_hostname: unknown = workerScript.hostname): IServerDef {
const hostname = helper.string("getServer", "hostname", _hostname);
updateDynamicRam("getServer", getRamCost(Player, "getServer"));
const server = safeGetServer(hostname, "getServer");
const copy = Object.assign({}, server) as any;
@ -1430,7 +1503,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
if (!copy.serverGrowth) copy.serverGrowth = 0;
return copy;
},
getServerMoneyAvailable: function (hostname: any): any {
getServerMoneyAvailable: function (_hostname: unknown): number {
const hostname = helper.string("getServerMoneyAvailable", "hostname", _hostname);
updateDynamicRam("getServerMoneyAvailable", getRamCost(Player, "getServerMoneyAvailable"));
const server = safeGetServer(hostname, "getServerMoneyAvailable");
if (!(server instanceof Server)) {
@ -1454,7 +1528,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
);
return server.moneyAvailable;
},
getServerSecurityLevel: function (hostname: any): any {
getServerSecurityLevel: function (_hostname: unknown): number {
const hostname = helper.string("getServerSecurityLevel", "hostname", _hostname);
updateDynamicRam("getServerSecurityLevel", getRamCost(Player, "getServerSecurityLevel"));
const server = safeGetServer(hostname, "getServerSecurityLevel");
if (!(server instanceof Server)) {
@ -1470,7 +1545,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
);
return server.hackDifficulty;
},
getServerBaseSecurityLevel: function (hostname: any): any {
getServerBaseSecurityLevel: function (_hostname: unknown): number {
const hostname = helper.string("getServerBaseSecurityLevel", "hostname", _hostname);
updateDynamicRam("getServerBaseSecurityLevel", getRamCost(Player, "getServerBaseSecurityLevel"));
workerScript.log(
"getServerBaseSecurityLevel",
@ -1490,7 +1566,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
);
return server.baseDifficulty;
},
getServerMinSecurityLevel: function (hostname: any): any {
getServerMinSecurityLevel: function (_hostname: unknown): number {
const hostname = helper.string("getServerMinSecurityLevel", "hostname", _hostname);
updateDynamicRam("getServerMinSecurityLevel", getRamCost(Player, "getServerMinSecurityLevel"));
const server = safeGetServer(hostname, "getServerMinSecurityLevel");
if (!(server instanceof Server)) {
@ -1506,7 +1583,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
);
return server.minDifficulty;
},
getServerRequiredHackingLevel: function (hostname: any): any {
getServerRequiredHackingLevel: function (_hostname: unknown): number {
const hostname = helper.string("getServerRequiredHackingLevel", "hostname", _hostname);
updateDynamicRam("getServerRequiredHackingLevel", getRamCost(Player, "getServerRequiredHackingLevel"));
const server = safeGetServer(hostname, "getServerRequiredHackingLevel");
if (!(server instanceof Server)) {
@ -1522,7 +1600,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
);
return server.requiredHackingSkill;
},
getServerMaxMoney: function (hostname: any): any {
getServerMaxMoney: function (_hostname: unknown): number {
const hostname = helper.string("getServerMaxMoney", "hostname", _hostname);
updateDynamicRam("getServerMaxMoney", getRamCost(Player, "getServerMaxMoney"));
const server = safeGetServer(hostname, "getServerMaxMoney");
if (!(server instanceof Server)) {
@ -1538,7 +1617,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
);
return server.moneyMax;
},
getServerGrowth: function (hostname: any): any {
getServerGrowth: function (_hostname: unknown): number {
const hostname = helper.string("getServerGrowth", "hostname", _hostname);
updateDynamicRam("getServerGrowth", getRamCost(Player, "getServerGrowth"));
const server = safeGetServer(hostname, "getServerGrowth");
if (!(server instanceof Server)) {
@ -1551,7 +1631,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
workerScript.log("getServerGrowth", () => `returned ${server.serverGrowth} for '${server.hostname}'`);
return server.serverGrowth;
},
getServerNumPortsRequired: function (hostname: any): any {
getServerNumPortsRequired: function (_hostname: unknown): number {
const hostname = helper.string("getServerNumPortsRequired", "hostname", _hostname);
updateDynamicRam("getServerNumPortsRequired", getRamCost(Player, "getServerNumPortsRequired"));
const server = safeGetServer(hostname, "getServerNumPortsRequired");
if (!(server instanceof Server)) {
@ -1567,7 +1648,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
);
return server.numOpenPortsRequired;
},
getServerRam: function (hostname: any): any {
getServerRam: function (_hostname: unknown): [number, number] {
const hostname = helper.string("getServerRam", "hostname", _hostname);
updateDynamicRam("getServerRam", getRamCost(Player, "getServerRam"));
workerScript.log(
"getServerRam",
@ -1580,23 +1662,28 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
);
return [server.maxRam, server.ramUsed];
},
getServerMaxRam: function (hostname: any): any {
getServerMaxRam: function (_hostname: unknown): number {
const hostname = helper.string("getServerMaxRam", "hostname", _hostname);
updateDynamicRam("getServerMaxRam", getRamCost(Player, "getServerMaxRam"));
const server = safeGetServer(hostname, "getServerMaxRam");
workerScript.log("getServerMaxRam", () => `returned ${numeralWrapper.formatRAM(server.maxRam)}`);
return server.maxRam;
},
getServerUsedRam: function (hostname: any): any {
getServerUsedRam: function (_hostname: unknown): number {
const hostname = helper.string("getServerUsedRam", "hostname", _hostname);
updateDynamicRam("getServerUsedRam", getRamCost(Player, "getServerUsedRam"));
const server = safeGetServer(hostname, "getServerUsedRam");
workerScript.log("getServerUsedRam", () => `returned ${numeralWrapper.formatRAM(server.ramUsed)}`);
return server.ramUsed;
},
serverExists: function (hostname: any): any {
serverExists: function (_hostname: unknown): boolean {
const hostname = helper.string("serverExists", "hostname", _hostname);
updateDynamicRam("serverExists", getRamCost(Player, "serverExists"));
return GetServer(hostname) !== null;
},
fileExists: function (filename: any, hostname: any = workerScript.hostname): any {
fileExists: function (_filename: unknown, _hostname: unknown = workerScript.hostname): boolean {
const filename = helper.string("fileExists", "filename", _filename);
const hostname = helper.string("fileExists", "hostname", _hostname);
updateDynamicRam("fileExists", getRamCost(Player, "fileExists"));
if (filename === undefined) {
throw makeRuntimeErrorMsg("fileExists", "Usage: fileExists(scriptname, [server])");
@ -1620,7 +1707,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
const txtFile = getTextFile(filename, server);
return txtFile != null;
},
isRunning: function (fn: any, hostname: any = workerScript.hostname, ...scriptArgs: any): any {
isRunning: function (fn: any, hostname: any = workerScript.hostname, ...scriptArgs: any[]): boolean {
updateDynamicRam("isRunning", getRamCost(Player, "isRunning"));
if (fn === undefined || hostname === undefined) {
throw makeRuntimeErrorMsg("isRunning", "Usage: isRunning(scriptname, server, [arg1], [arg2]...)");
@ -1631,17 +1718,18 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return getRunningScript(fn, hostname, "isRunning", scriptArgs) != null;
}
},
getPurchasedServerLimit: function (): any {
getPurchasedServerLimit: function (): number {
updateDynamicRam("getPurchasedServerLimit", getRamCost(Player, "getPurchasedServerLimit"));
return getPurchaseServerLimit();
},
getPurchasedServerMaxRam: function (): any {
getPurchasedServerMaxRam: function (): number {
updateDynamicRam("getPurchasedServerMaxRam", getRamCost(Player, "getPurchasedServerMaxRam"));
return getPurchaseServerMaxRam();
},
getPurchasedServerCost: function (ram: any): any {
getPurchasedServerCost: function (_ram: unknown): number {
const ram = helper.number("getPurchasedServerCost", "ram", _ram);
updateDynamicRam("getPurchasedServerCost", getRamCost(Player, "getPurchasedServerCost"));
const cost = getPurchaseServerCost(ram);
@ -1652,10 +1740,10 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return cost;
},
purchaseServer: function (aname: any, aram: any): any {
purchaseServer: function (_name: unknown, _ram: unknown): string {
const name = helper.string("purchaseServer", "name", _name);
const ram = helper.number("purchaseServer", "ram", _ram);
if (arguments.length !== 2) throw makeRuntimeErrorMsg("purchaseServer", "Takes 2 arguments");
const name = helper.string("purchaseServer", "name", aname);
const ram = helper.number("purchaseServer", "ram", aram);
updateDynamicRam("purchaseServer", getRamCost(Player, "purchaseServer"));
let hostnameStr = String(name);
hostnameStr = hostnameStr.replace(/\s+/g, "");
@ -1716,7 +1804,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
);
return newServ.hostname;
},
deleteServer: function (name: any): any {
deleteServer: function (_name: unknown): boolean {
const name = helper.string("purchaseServer", "name", _name);
updateDynamicRam("deleteServer", getRamCost(Player, "deleteServer"));
let hostnameStr = String(name);
hostnameStr = hostnameStr.replace(/\s\s+/g, "");
@ -1792,7 +1881,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
);
return false;
},
getPurchasedServers: function (): any {
getPurchasedServers: function (): string[] {
updateDynamicRam("getPurchasedServers", getRamCost(Player, "getPurchasedServers"));
const res: string[] = [];
Player.purchasedServers.forEach(function (hostname) {
@ -1800,7 +1889,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
});
return res;
},
writePort: function (port: any, data: any = ""): any {
writePort: function (_port: unknown, data: any = ""): Promise<any> {
const port = helper.number("writePort", "port", _port);
updateDynamicRam("writePort", getRamCost(Player, "writePort"));
if (typeof data !== "string" && typeof data !== "number") {
throw makeRuntimeErrorMsg(
@ -1811,7 +1901,9 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
const iport = helper.getValidPort("writePort", port);
return Promise.resolve(iport.write(data));
},
write: function (port: any, data: any = "", mode: any = "a"): any {
write: function (_port: unknown, data: any = "", _mode: unknown = "a"): Promise<void> {
const port = helper.string("write", "port", _port);
const mode = helper.string("write", "mode", _mode);
updateDynamicRam("write", getRamCost(Player, "write"));
if (isString(port)) {
// Write to script or text file
@ -1864,7 +1956,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
throw makeRuntimeErrorMsg("write", `Invalid argument: ${port}`);
}
},
tryWritePort: function (port: any, data: any = ""): any {
tryWritePort: function (_port: unknown, data: any = ""): Promise<any> {
let port = helper.number("tryWritePort", "port", _port);
updateDynamicRam("tryWritePort", getRamCost(Player, "tryWritePort"));
if (typeof data !== "string" && typeof data !== "number") {
throw makeRuntimeErrorMsg(
@ -1889,14 +1982,16 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
throw makeRuntimeErrorMsg("tryWritePort", `Invalid argument: ${port}`);
}
},
readPort: function (port: any): any {
readPort: function (_port: unknown): any {
const port = helper.number("readPort", "port", _port);
updateDynamicRam("readPort", getRamCost(Player, "readPort"));
// Read from port
const iport = helper.getValidPort("readPort", port);
const x = iport.read();
return x;
},
read: function (port: any): any {
read: function (_port: unknown): string {
const port = helper.string("read", "port", _port);
updateDynamicRam("read", getRamCost(Player, "read"));
if (isString(port)) {
// Read from script or text file
@ -1925,13 +2020,15 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
throw makeRuntimeErrorMsg("read", `Invalid argument: ${port}`);
}
},
peek: function (port: any): any {
peek: function (_port: unknown): any {
const port = helper.number("peek", "port", _port);
updateDynamicRam("peek", getRamCost(Player, "peek"));
const iport = helper.getValidPort("peek", port);
const x = iport.peek();
return x;
},
clear: function (file: any): any {
clear: function (_file: unknown): void {
const file = helper.string("peek", "file", _file);
updateDynamicRam("clear", getRamCost(Player, "clear"));
if (isString(file)) {
// Clear text file
@ -1947,20 +2044,22 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
} else {
throw makeRuntimeErrorMsg("clear", `Invalid argument: ${file}`);
}
return 0;
},
clearPort: function (port: any): any {
clearPort: function (_port: unknown): void {
const port = helper.number("clearPort", "port", _port);
updateDynamicRam("clearPort", getRamCost(Player, "clearPort"));
// Clear port
const iport = helper.getValidPort("clearPort", port);
return iport.clear();
iport.clear();
},
getPortHandle: function (port: any): IPort {
getPortHandle: function (_port: unknown): IPort {
const port = helper.number("getPortHandle", "port", _port);
updateDynamicRam("getPortHandle", getRamCost(Player, "getPortHandle"));
const iport = helper.getValidPort("getPortHandle", port);
return iport;
},
rm: function (fn: any, hostname: any): any {
rm: function (_fn: unknown, hostname: any): boolean {
const fn = helper.string("rm", "fn", _fn);
updateDynamicRam("rm", getRamCost(Player, "rm"));
if (hostname == null || hostname === "") {
@ -1975,7 +2074,9 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return status.res;
},
scriptRunning: function (scriptname: any, hostname: any): any {
scriptRunning: function (_scriptname: unknown, _hostname: unknown): boolean {
const scriptname = helper.string("scriptRunning", "scriptname", _scriptname);
const hostname = helper.string("scriptRunning", "hostname", _hostname);
updateDynamicRam("scriptRunning", getRamCost(Player, "scriptRunning"));
const server = safeGetServer(hostname, "scriptRunning");
for (let i = 0; i < server.runningScripts.length; ++i) {
@ -1985,7 +2086,9 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
}
return false;
},
scriptKill: function (scriptname: any, hostname: any): any {
scriptKill: function (_scriptname: unknown, _hostname: unknown): boolean {
const scriptname = helper.string("scriptKill", "scriptname", _scriptname);
const hostname = helper.string("scriptKill", "hostname", _hostname);
updateDynamicRam("scriptKill", getRamCost(Player, "scriptKill"));
const server = safeGetServer(hostname, "scriptKill");
let suc = false;
@ -1998,11 +2101,13 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
}
return suc;
},
getScriptName: function (): any {
getScriptName: function (): string {
updateDynamicRam("getScriptName", getRamCost(Player, "getScriptName"));
return workerScript.name;
},
getScriptRam: function (scriptname: any, hostname: any = workerScript.hostname): any {
getScriptRam: function (_scriptname: unknown, _hostname: unknown = workerScript.hostname): number {
const scriptname = helper.string("getScriptRam", "scriptname", _scriptname);
const hostname = helper.string("getScriptRam", "hostname", _hostname);
updateDynamicRam("getScriptRam", getRamCost(Player, "getScriptRam"));
const server = safeGetServer(hostname, "getScriptRam");
for (let i = 0; i < server.scripts.length; ++i) {
@ -2012,7 +2117,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
}
return 0;
},
getRunningScript: function (fn: any, hostname: any, ...args: any[]): any {
getRunningScript: function (fn: any, hostname: any, ...args: any[]): IRunningScriptDef | null {
updateDynamicRam("getRunningScript", getRamCost(Player, "getRunningScript"));
let runningScript;
@ -2040,7 +2145,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
threads: runningScript.threads,
};
},
getHackTime: function (hostname: any): any {
getHackTime: function (_hostname: unknown = workerScript.hostname): number {
const hostname = helper.string("getHackTime", "hostname", _hostname);
updateDynamicRam("getHackTime", getRamCost(Player, "getHackTime"));
const server = safeGetServer(hostname, "getHackTime");
if (!(server instanceof Server)) {
@ -2053,7 +2159,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return calculateHackingTime(server, Player) * 1000;
},
getGrowTime: function (hostname: any): any {
getGrowTime: function (_hostname: unknown = workerScript.hostname): number {
const hostname = helper.string("getGrowTime", "hostname", _hostname);
updateDynamicRam("getGrowTime", getRamCost(Player, "getGrowTime"));
const server = safeGetServer(hostname, "getGrowTime");
if (!(server instanceof Server)) {
@ -2066,7 +2173,8 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return calculateGrowTime(server, Player) * 1000;
},
getWeakenTime: function (hostname: any = workerScript.hostname): any {
getWeakenTime: function (_hostname: unknown = workerScript.hostname): number {
const hostname = helper.string("getWeakenTime", "hostname", _hostname);
updateDynamicRam("getWeakenTime", getRamCost(Player, "getWeakenTime"));
const server = safeGetServer(hostname, "getWeakenTime");
if (!(server instanceof Server)) {
@ -2108,7 +2216,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return runningScriptObj.onlineMoneyMade / runningScriptObj.onlineRunningTime;
}
},
getScriptExpGain: function (scriptname?: any, hostname?: any, ...args: any[]): any {
getScriptExpGain: function (scriptname?: any, hostname?: any, ...args: any[]): number {
updateDynamicRam("getScriptExpGain", getRamCost(Player, "getScriptExpGain"));
if (arguments.length === 0) {
let total = 0;
@ -2130,40 +2238,42 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
return runningScriptObj.onlineExpGained / runningScriptObj.onlineRunningTime;
}
},
nFormat: function (n: any, format: any): any {
nFormat: function (_n: unknown, _format: unknown): string {
const n = helper.number("nFormat", "n", _n);
const format = helper.string("nFormat", "format", _format);
updateDynamicRam("nFormat", getRamCost(Player, "nFormat"));
if (isNaN(n) || isNaN(parseFloat(n)) || typeof format !== "string") {
if (isNaN(n)) {
return "";
}
return numeralWrapper.format(parseFloat(n), format);
return numeralWrapper.format(n, format);
},
tFormat: function (milliseconds: any, milliPrecision: any = false): any {
tFormat: function (_milliseconds: unknown, _milliPrecision: unknown = false): string {
const milliseconds = helper.number("tFormat", "milliseconds", _milliseconds);
const milliPrecision = helper.boolean(_milliPrecision);
updateDynamicRam("tFormat", getRamCost(Player, "tFormat"));
return convertTimeMsToTimeElapsedString(milliseconds, milliPrecision);
},
getTimeSinceLastAug: function (): any {
getTimeSinceLastAug: function (): number {
updateDynamicRam("getTimeSinceLastAug", getRamCost(Player, "getTimeSinceLastAug"));
return Player.playtimeSinceLastAug;
},
alert: function (message: any): void {
alert: function (_message: unknown): void {
const message = helper.string("alert", "message", _message);
updateDynamicRam("alert", getRamCost(Player, "alert"));
message = argsToString([message]);
dialogBoxCreate(message);
},
toast: function (message: any, variant: any = "success", duration: any = 2000): void {
toast: function (_message: unknown, _variant: unknown = "success", duration: any = 2000): void {
const message = helper.string("toast", "message", _message);
const variant = helper.string("toast", "variant", _variant);
updateDynamicRam("toast", getRamCost(Player, "toast"));
if (!["success", "info", "warning", "error"].includes(variant))
throw new Error(`variant must be one of "success", "info", "warning", or "error"`);
message = argsToString([message]);
SnackbarEvents.emit(message, variant, duration);
SnackbarEvents.emit(message, variant as any, duration);
},
prompt: function (txt: any, options?: { type?: string; options?: string[] }): any {
prompt: function (_txt: unknown, options?: { type?: string; options?: string[] }): Promise<boolean | string> {
const txt = helper.string("toast", "txt", _txt);
updateDynamicRam("prompt", getRamCost(Player, "prompt"));
if (!isString(txt)) {
txt = JSON.stringify(txt);
}
return new Promise(function (resolve) {
PromptEvent.emit({
@ -2173,7 +2283,14 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
});
});
},
wget: async function (url: any, target: any, hostname: any = workerScript.hostname): Promise<boolean> {
wget: async function (
_url: unknown,
_target: unknown,
_hostname: unknown = workerScript.hostname,
): Promise<boolean> {
const url = helper.string("wget", "url", _url);
const target = helper.string("wget", "target", _target);
const hostname = helper.string("wget", "hostname", _hostname);
updateDynamicRam("wget", getRamCost(Player, "wget"));
if (!isScriptFilename(target) && !target.endsWith(".txt")) {
workerScript.log("wget", () => `Invalid target file: '${target}'. Must be a script or text file.`);
@ -2211,7 +2328,7 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
});
});
},
getFavorToDonate: function (): any {
getFavorToDonate: function (): number {
updateDynamicRam("getFavorToDonate", getRamCost(Player, "getFavorToDonate"));
return Math.floor(CONSTANTS.BaseFavorToDonate * BitNodeMultipliers.RepToDonateToFaction);
},
@ -2332,11 +2449,12 @@ export function NetscriptFunctions(workerScript: WorkerScript): NS {
f();
}; // Wrap the user function to prevent WorkerScript leaking as 'this'
},
mv: function (host: string, source: string, destination: string): void {
mv: function (_host: unknown, _source: unknown, _destination: unknown): void {
const host = helper.string("mv", "host", _host);
const source = helper.string("mv", "source", _source);
const destination = helper.string("mv", "destination", _destination);
updateDynamicRam("mv", getRamCost(Player, "mv"));
if (arguments.length != 3) throw makeRuntimeErrorMsg("mv", "Takes 3 argument.");
if (!isValidFilePath(source)) throw makeRuntimeErrorMsg("mv", `Invalid filename: '${source}'`);
if (!isValidFilePath(destination)) throw makeRuntimeErrorMsg("mv", `Invalid filename: '${destination}'`);

@ -5,13 +5,14 @@ import { Bladeburner } from "../Bladeburner/Bladeburner";
import { getRamCost } from "../Netscript/RamCostGenerator";
import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers";
import { Bladeburner as INetscriptBladeburner, BladeburnerCurAction } from "../ScriptEditor/NetscriptDefinitions";
import { IAction } from "src/Bladeburner/IAction";
export function NetscriptBladeburner(
player: IPlayer,
workerScript: WorkerScript,
helper: INetscriptHelper,
): INetscriptBladeburner {
const checkBladeburnerAccess = function (func: any, skipjoined: any = false): void {
const checkBladeburnerAccess = function (func: string, skipjoined = false): void {
const bladeburner = player.bladeburner;
if (bladeburner === null) throw new Error("Must have joined bladeburner");
const apiAccess =
@ -32,7 +33,7 @@ export function NetscriptBladeburner(
}
};
const checkBladeburnerCity = function (func: any, city: any): void {
const checkBladeburnerCity = function (func: string, city: string): void {
const bladeburner = player.bladeburner;
if (bladeburner === null) throw new Error("Must have joined bladeburner");
if (!bladeburner.cities.hasOwnProperty(city)) {
@ -40,7 +41,7 @@ export function NetscriptBladeburner(
}
};
const getBladeburnerActionObject = function (func: any, type: any, name: any): any {
const getBladeburnerActionObject = function (func: string, type: string, name: string): IAction {
const bladeburner = player.bladeburner;
if (bladeburner === null) throw new Error("Must have joined bladeburner");
const actionId = bladeburner.getActionIdFromTypeAndName(type, name);
@ -77,10 +78,11 @@ export function NetscriptBladeburner(
if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
return bladeburner.getBlackOpNamesNetscriptFn();
},
getBlackOpRank: function (name: any = ""): number {
getBlackOpRank: function (_blackOpName: unknown): number {
const blackOpName = helper.string("getBlackOpRank", "blackOpName", _blackOpName);
helper.updateDynamicRam("getBlackOpRank", getRamCost(player, "bladeburner", "getBlackOpRank"));
checkBladeburnerAccess("getBlackOpRank");
const action: any = getBladeburnerActionObject("getBlackOpRank", "blackops", name);
const action: any = getBladeburnerActionObject("getBlackOpRank", "blackops", blackOpName);
return action.reqdRank;
},
getGeneralActionNames: function (): string[] {
@ -97,7 +99,9 @@ export function NetscriptBladeburner(
if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
return bladeburner.getSkillNamesNetscriptFn();
},
startAction: function (type: any = "", name: any = ""): boolean {
startAction: function (_type: unknown, _name: unknown): boolean {
const type = helper.string("startAction", "type", _type);
const name = helper.string("startAction", "name", _name);
helper.updateDynamicRam("startAction", getRamCost(player, "bladeburner", "startAction"));
checkBladeburnerAccess("startAction");
const bladeburner = player.bladeburner;
@ -122,7 +126,9 @@ export function NetscriptBladeburner(
if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
return bladeburner.getTypeAndNameFromActionId(bladeburner.action);
},
getActionTime: function (type: any = "", name: any = ""): number {
getActionTime: function (_type: unknown, _name: unknown): number {
const type = helper.string("getActionTime", "type", _type);
const name = helper.string("getActionTime", "name", _name);
helper.updateDynamicRam("getActionTime", getRamCost(player, "bladeburner", "getActionTime"));
checkBladeburnerAccess("getActionTime");
const bladeburner = player.bladeburner;
@ -133,7 +139,9 @@ export function NetscriptBladeburner(
throw helper.makeRuntimeErrorMsg("bladeburner.getActionTime", e);
}
},
getActionEstimatedSuccessChance: function (type: any = "", name: any = ""): [number, number] {
getActionEstimatedSuccessChance: function (_type: unknown, _name: unknown): [number, number] {
const type = helper.string("getActionEstimatedSuccessChance", "type", _type);
const name = helper.string("getActionEstimatedSuccessChance", "name", _name);
helper.updateDynamicRam(
"getActionEstimatedSuccessChance",
getRamCost(player, "bladeburner", "getActionEstimatedSuccessChance"),
@ -147,7 +155,10 @@ export function NetscriptBladeburner(
throw helper.makeRuntimeErrorMsg("bladeburner.getActionEstimatedSuccessChance", e);
}
},
getActionRepGain: function (type: any = "", name: any = "", level: any): number {
getActionRepGain: function (_type: unknown, _name: unknown, _level: unknown): number {
const type = helper.string("getActionRepGain", "type", _type);
const name = helper.string("getActionRepGain", "name", _name);
const level = helper.number("getActionRepGain", "level", _level);
helper.updateDynamicRam("getActionRepGain", getRamCost(player, "bladeburner", "getActionRepGain"));
checkBladeburnerAccess("getActionRepGain");
const action = getBladeburnerActionObject("getActionRepGain", type, name);
@ -160,7 +171,9 @@ export function NetscriptBladeburner(
return action.rankGain * rewardMultiplier * BitNodeMultipliers.BladeburnerRank;
},
getActionCountRemaining: function (type: any = "", name: any = ""): number {
getActionCountRemaining: function (_type: unknown, _name: unknown): number {
const type = helper.string("getActionCountRemaining", "type", _type);
const name = helper.string("getActionCountRemaining", "name", _name);
helper.updateDynamicRam("getActionCountRemaining", getRamCost(player, "bladeburner", "getActionCountRemaining"));
checkBladeburnerAccess("getActionCountRemaining");
const bladeburner = player.bladeburner;
@ -171,31 +184,43 @@ export function NetscriptBladeburner(
throw helper.makeRuntimeErrorMsg("bladeburner.getActionCountRemaining", e);
}
},
getActionMaxLevel: function (type: any = "", name: any = ""): number {
getActionMaxLevel: function (_type: unknown, _name: unknown): number {
const type = helper.string("getActionMaxLevel", "type", _type);
const name = helper.string("getActionMaxLevel", "name", _name);
helper.updateDynamicRam("getActionMaxLevel", getRamCost(player, "bladeburner", "getActionMaxLevel"));
checkBladeburnerAccess("getActionMaxLevel");
const action = getBladeburnerActionObject("getActionMaxLevel", type, name);
return action.maxLevel;
},
getActionCurrentLevel: function (type: any = "", name: any = ""): number {
getActionCurrentLevel: function (_type: unknown, _name: unknown): number {
const type = helper.string("getActionCurrentLevel", "type", _type);
const name = helper.string("getActionCurrentLevel", "name", _name);
helper.updateDynamicRam("getActionCurrentLevel", getRamCost(player, "bladeburner", "getActionCurrentLevel"));
checkBladeburnerAccess("getActionCurrentLevel");
const action = getBladeburnerActionObject("getActionCurrentLevel", type, name);
return action.level;
},
getActionAutolevel: function (type: any = "", name: any = ""): boolean {
getActionAutolevel: function (_type: unknown, _name: unknown): boolean {
const type = helper.string("getActionAutolevel", "type", _type);
const name = helper.string("getActionAutolevel", "name", _name);
helper.updateDynamicRam("getActionAutolevel", getRamCost(player, "bladeburner", "getActionAutolevel"));
checkBladeburnerAccess("getActionAutolevel");
const action = getBladeburnerActionObject("getActionCurrentLevel", type, name);
return action.autoLevel;
},
setActionAutolevel: function (type: any = "", name: any = "", autoLevel: any = true): void {
setActionAutolevel: function (_type: unknown, _name: unknown, _autoLevel: unknown = true): void {
const type = helper.string("setActionAutolevel", "type", _type);
const name = helper.string("setActionAutolevel", "name", _name);
const autoLevel = helper.boolean(_autoLevel);
helper.updateDynamicRam("setActionAutolevel", getRamCost(player, "bladeburner", "setActionAutolevel"));
checkBladeburnerAccess("setActionAutolevel");
const action = getBladeburnerActionObject("setActionAutolevel", type, name);
action.autoLevel = autoLevel;
},
setActionLevel: function (type: any = "", name: any = "", level: any = 1): void {
setActionLevel: function (_type: unknown, _name: unknown, _level: unknown = 1): void {
const type = helper.string("setActionLevel", "type", _type);
const name = helper.string("setActionLevel", "name", _name);
const level = helper.number("setActionLevel", "level", _level);
helper.updateDynamicRam("setActionLevel", getRamCost(player, "bladeburner", "setActionLevel"));
checkBladeburnerAccess("setActionLevel");
const action = getBladeburnerActionObject("setActionLevel", type, name);
@ -221,7 +246,8 @@ export function NetscriptBladeburner(
if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
return bladeburner.skillPoints;
},
getSkillLevel: function (skillName: any = ""): number {
getSkillLevel: function (_skillName: unknown): number {
const skillName = helper.string("getSkillLevel", "skillName", _skillName);
helper.updateDynamicRam("getSkillLevel", getRamCost(player, "bladeburner", "getSkillLevel"));
checkBladeburnerAccess("getSkillLevel");
const bladeburner = player.bladeburner;
@ -232,7 +258,8 @@ export function NetscriptBladeburner(
throw helper.makeRuntimeErrorMsg("bladeburner.getSkillLevel", e);
}
},
getSkillUpgradeCost: function (skillName: any = ""): number {
getSkillUpgradeCost: function (_skillName: unknown): number {
const skillName = helper.string("getSkillUpgradeCost", "skillName", _skillName);
helper.updateDynamicRam("getSkillUpgradeCost", getRamCost(player, "bladeburner", "getSkillUpgradeCost"));
checkBladeburnerAccess("getSkillUpgradeCost");
const bladeburner = player.bladeburner;
@ -243,7 +270,8 @@ export function NetscriptBladeburner(
throw helper.makeRuntimeErrorMsg("bladeburner.getSkillUpgradeCost", e);
}
},
upgradeSkill: function (skillName: any): boolean {
upgradeSkill: function (_skillName: unknown): boolean {
const skillName = helper.string("upgradeSkill", "skillName", _skillName);
helper.updateDynamicRam("upgradeSkill", getRamCost(player, "bladeburner", "upgradeSkill"));
checkBladeburnerAccess("upgradeSkill");
const bladeburner = player.bladeburner;
@ -254,7 +282,9 @@ export function NetscriptBladeburner(
throw helper.makeRuntimeErrorMsg("bladeburner.upgradeSkill", e);
}
},
getTeamSize: function (type: any = "", name: any = ""): number {
getTeamSize: function (_type: unknown, _name: unknown): number {
const type = helper.string("getTeamSize", "type", _type);
const name = helper.string("getTeamSize", "name", _name);
helper.updateDynamicRam("getTeamSize", getRamCost(player, "bladeburner", "getTeamSize"));
checkBladeburnerAccess("getTeamSize");
const bladeburner = player.bladeburner;
@ -265,7 +295,10 @@ export function NetscriptBladeburner(
throw helper.makeRuntimeErrorMsg("bladeburner.getTeamSize", e);
}
},
setTeamSize: function (type: any = "", name: any = "", size: any): number {
setTeamSize: function (_type: unknown, _name: unknown, _size: unknown): number {
const type = helper.string("setTeamSize", "type", _type);
const name = helper.string("setTeamSize", "name", _name);
const size = helper.number("setTeamSize", "size", _size);
helper.updateDynamicRam("setTeamSize", getRamCost(player, "bladeburner", "setTeamSize"));
checkBladeburnerAccess("setTeamSize");
const bladeburner = player.bladeburner;
@ -276,7 +309,8 @@ export function NetscriptBladeburner(
throw helper.makeRuntimeErrorMsg("bladeburner.setTeamSize", e);
}
},
getCityEstimatedPopulation: function (cityName: any): number {
getCityEstimatedPopulation: function (_cityName: unknown): number {
const cityName = helper.string("getCityEstimatedPopulation", "cityName", _cityName);
helper.updateDynamicRam(
"getCityEstimatedPopulation",
getRamCost(player, "bladeburner", "getCityEstimatedPopulation"),
@ -287,7 +321,8 @@ export function NetscriptBladeburner(
if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
return bladeburner.cities[cityName].popEst;
},
getCityCommunities: function (cityName: any): number {
getCityCommunities: function (_cityName: unknown): number {
const cityName = helper.string("getCityCommunities", "cityName", _cityName);
helper.updateDynamicRam("getCityCommunities", getRamCost(player, "bladeburner", "getCityCommunities"));
checkBladeburnerAccess("getCityCommunities");
checkBladeburnerCity("getCityCommunities", cityName);
@ -295,7 +330,8 @@ export function NetscriptBladeburner(
if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
return bladeburner.cities[cityName].comms;
},
getCityChaos: function (cityName: any): number {
getCityChaos: function (_cityName: unknown): number {
const cityName = helper.string("getCityChaos", "cityName", _cityName);
helper.updateDynamicRam("getCityChaos", getRamCost(player, "bladeburner", "getCityChaos"));
checkBladeburnerAccess("getCityChaos");
checkBladeburnerCity("getCityChaos", cityName);
@ -310,13 +346,14 @@ export function NetscriptBladeburner(
if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
return bladeburner.city;
},
switchCity: function (cityName: any): boolean {
switchCity: function (_cityName: unknown): boolean {
const cityName = helper.string("switchCity", "cityName", _cityName);
helper.updateDynamicRam("switchCity", getRamCost(player, "bladeburner", "switchCity"));
checkBladeburnerAccess("switchCity");
checkBladeburnerCity("switchCity", cityName);
const bladeburner = player.bladeburner;
if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
return (bladeburner.city = cityName);
return bladeburner.city === cityName;
},
getStamina: function (): [number, number] {
helper.updateDynamicRam("getStamina", getRamCost(player, "bladeburner", "getStamina"));
@ -365,7 +402,7 @@ export function NetscriptBladeburner(
checkBladeburnerAccess("getBonusTime");
const bladeburner = player.bladeburner;
if (bladeburner === null) throw new Error("Should not be called without Bladeburner");
return (Math.round(bladeburner.storedCycles / 5))*1000;
return Math.round(bladeburner.storedCycles / 5) * 1000;
},
};
}

@ -4,14 +4,14 @@ import { IPlayer } from "../PersonObjects/IPlayer";
import { getRamCost } from "../Netscript/RamCostGenerator";
import { is2DArray } from "../utils/helpers/is2DArray";
import { CodingContract } from "../CodingContracts";
import { CodingContract as ICodingContract } from "../ScriptEditor/NetscriptDefinitions";
import { CodingAttemptOptions, CodingContract as ICodingContract } from "../ScriptEditor/NetscriptDefinitions";
export function NetscriptCodingContract(
player: IPlayer,
workerScript: WorkerScript,
helper: INetscriptHelper,
): ICodingContract {
const getCodingContract = function (func: any, hostname: any, filename: any): CodingContract {
const getCodingContract = function (func: string, hostname: string, filename: string): CodingContract {
const server = helper.getServer(hostname, func);
const contract = server.getContract(filename);
if (contract == null) {
@ -27,10 +27,12 @@ export function NetscriptCodingContract(
return {
attempt: function (
answer: any,
filename: any,
hostname: any = workerScript.hostname,
{ returnReward }: any = {},
_filename: unknown,
_hostname: unknown = workerScript.hostname,
{ returnReward }: CodingAttemptOptions = { returnReward: false },
): boolean | string {
const filename = helper.string("attempt", "filename", _filename);
const hostname = helper.string("attempt", "hostname", _hostname);
helper.updateDynamicRam("attempt", getRamCost(player, "codingcontract", "attempt"));
const contract = getCodingContract("attempt", hostname, filename);
@ -53,7 +55,10 @@ export function NetscriptCodingContract(
const serv = helper.getServer(hostname, "codingcontract.attempt");
if (contract.isSolution(answer)) {
const reward = player.gainCodingContractReward(creward, contract.getDifficulty());
workerScript.log("codingcontract.attempt", () => `Successfully completed Coding Contract '${filename}'. Reward: ${reward}`);
workerScript.log(
"codingcontract.attempt",
() => `Successfully completed Coding Contract '${filename}'. Reward: ${reward}`,
);
serv.removeContract(filename);
return returnReward ? reward : true;
} else {
@ -68,7 +73,8 @@ export function NetscriptCodingContract(
workerScript.log(
"codingcontract.attempt",
() =>
`Coding Contract attempt '${filename}' failed. ${contract.getMaxNumTries() - contract.tries
`Coding Contract attempt '${filename}' failed. ${
contract.getMaxNumTries() - contract.tries
} attempts remaining.`,
);
}
@ -76,12 +82,16 @@ export function NetscriptCodingContract(
return returnReward ? "" : false;
}
},
getContractType: function (filename: any, hostname: any = workerScript.hostname): string {
getContractType: function (_filename: unknown, _hostname: unknown = workerScript.hostname): string {
const filename = helper.string("getContractType", "filename", _filename);
const hostname = helper.string("getContractType", "hostname", _hostname);
helper.updateDynamicRam("getContractType", getRamCost(player, "codingcontract", "getContractType"));
const contract = getCodingContract("getContractType", hostname, filename);
return contract.getType();
},
getData: function (filename: any, hostname: any = workerScript.hostname): any {
getData: function (_filename: unknown, _hostname: unknown = workerScript.hostname): any {
const filename = helper.string("getContractType", "filename", _filename);
const hostname = helper.string("getContractType", "hostname", _hostname);
helper.updateDynamicRam("getData", getRamCost(player, "codingcontract", "getData"));
const contract = getCodingContract("getData", hostname, filename);
const data = contract.getData();
@ -101,12 +111,16 @@ export function NetscriptCodingContract(
return data;
}
},
getDescription: function (filename: any, hostname: any = workerScript.hostname): string {
getDescription: function (_filename: unknown, _hostname: unknown = workerScript.hostname): string {
const filename = helper.string("getDescription", "filename", _filename);
const hostname = helper.string("getDescription", "hostname", _hostname);
helper.updateDynamicRam("getDescription", getRamCost(player, "codingcontract", "getDescription"));
const contract = getCodingContract("getDescription", hostname, filename);
return contract.getDescription();
},
getNumTriesRemaining: function (filename: any, hostname: any = workerScript.hostname): number {
getNumTriesRemaining: function (_filename: unknown, _hostname: unknown = workerScript.hostname): number {
const filename = helper.string("getNumTriesRemaining", "filename", _filename);
const hostname = helper.string("getNumTriesRemaining", "hostname", _hostname);
helper.updateDynamicRam("getNumTriesRemaining", getRamCost(player, "codingcontract", "getNumTriesRemaining"));
const contract = getCodingContract("getNumTriesRemaining", hostname, filename);
return contract.getMaxNumTries() - contract.tries;

@ -21,7 +21,7 @@ import {
Division as NSDivision,
WarehouseAPI,
OfficeAPI,
InvestmentOffer
InvestmentOffer,
} from "../ScriptEditor/NetscriptDefinitions";
import {
@ -100,8 +100,8 @@ export function NetscriptCorporation(
return upgrade[1];
}
function getUpgradeLevel(aupgradeName: string): number {
const upgradeName = helper.string("levelUpgrade", "upgradeName", aupgradeName);
function getUpgradeLevel(_upgradeName: string): number {
const upgradeName = helper.string("levelUpgrade", "upgradeName", _upgradeName);
const corporation = getCorporation();
const upgrade = Object.values(CorporationUpgrades).find((upgrade) => upgrade[4] === upgradeName);
if (upgrade === undefined) throw new Error(`No upgrade named '${upgradeName}'`);
@ -109,8 +109,8 @@ export function NetscriptCorporation(
return corporation.upgrades[upgN];
}
function getUpgradeLevelCost(aupgradeName: string): number {
const upgradeName = helper.string("levelUpgrade", "upgradeName", aupgradeName);
function getUpgradeLevelCost(_upgradeName: string): number {
const upgradeName = helper.string("levelUpgrade", "upgradeName", _upgradeName);
const corporation = getCorporation();
const upgrade = Object.values(CorporationUpgrades).find((upgrade) => upgrade[4] === upgradeName);
if (upgrade === undefined) throw new Error(`No upgrade named '${upgradeName}'`);
@ -135,11 +135,15 @@ export function NetscriptCorporation(
function getInvestmentOffer(): InvestmentOffer {
const corporation = getCorporation();
if (corporation.fundingRound >= CorporationConstants.FundingRoundShares.length || corporation.fundingRound >= CorporationConstants.FundingRoundMultiplier.length || corporation.public)
if (
corporation.fundingRound >= CorporationConstants.FundingRoundShares.length ||
corporation.fundingRound >= CorporationConstants.FundingRoundMultiplier.length ||
corporation.public
)
return {
funds: 0,
shares: 0,
round: corporation.fundingRound + 1 // Make more readable
round: corporation.fundingRound + 1, // Make more readable
}; // Don't throw an error here, no reason to have a second function to check if you can get investment.
const val = corporation.determineValuation();
const percShares = CorporationConstants.FundingRoundShares[corporation.fundingRound];
@ -149,13 +153,18 @@ export function NetscriptCorporation(
return {
funds: funding,
shares: investShares,
round: corporation.fundingRound + 1 // Make more readable
round: corporation.fundingRound + 1, // Make more readable
};
}
function acceptInvestmentOffer(): boolean {
const corporation = getCorporation();
if (corporation.fundingRound >= CorporationConstants.FundingRoundShares.length || corporation.fundingRound >= CorporationConstants.FundingRoundMultiplier.length || corporation.public) return false;
if (
corporation.fundingRound >= CorporationConstants.FundingRoundShares.length ||
corporation.fundingRound >= CorporationConstants.FundingRoundMultiplier.length ||
corporation.public
)
return false;
const val = corporation.determineValuation();
const percShares = CorporationConstants.FundingRoundShares[corporation.fundingRound];
const roundMultiplier = CorporationConstants.FundingRoundMultiplier[corporation.fundingRound];
@ -181,7 +190,6 @@ export function NetscriptCorporation(
return true;
}
function getResearchCost(division: IIndustry, researchName: string): number {
const researchTree = IndustryResearchTrees[division.type];
if (researchTree === undefined) throw new Error(`No research tree for industry '${division.type}'`);
@ -192,17 +200,18 @@ export function NetscriptCorporation(
}
function hasResearched(division: IIndustry, researchName: string): boolean {
return division.researched[researchName] === undefined ? false : division.researched[researchName] as boolean;
return division.researched[researchName] === undefined ? false : (division.researched[researchName] as boolean);
}
function bribe(factionName: string, amountCash: number, amountShares: number): boolean {
if (!player.factions.includes(factionName)) throw new Error("Invalid faction name");
if (isNaN(amountCash) || amountCash < 0 || isNaN(amountShares) || amountShares < 0) throw new Error("Invalid value for amount field! Must be numeric, grater than 0.");
if (isNaN(amountCash) || amountCash < 0 || isNaN(amountShares) || amountShares < 0)
throw new Error("Invalid value for amount field! Must be numeric, grater than 0.");
const corporation = getCorporation();
if (corporation.funds < amountCash) return false;
if (corporation.numShares < amountShares) return false;
const faction = Factions[factionName]
const faction = Factions[factionName];
const info = faction.getInfo();
if (!info.offersWork()) return false;
if (player.hasGangWith(factionName)) return false;
@ -221,14 +230,14 @@ export function NetscriptCorporation(
return corporation;
}
function getDivision(divisionName: any): IIndustry {
function getDivision(divisionName: string): IIndustry {
const corporation = getCorporation();
const division = corporation.divisions.find((div) => div.name === divisionName);
if (division === undefined) throw new Error(`No division named '${divisionName}'`);
return division;
}
function getOffice(divisionName: any, cityName: any): OfficeSpace {
function getOffice(divisionName: string, cityName: string): OfficeSpace {
const division = getDivision(divisionName);
if (!(cityName in division.offices)) throw new Error(`Invalid city name '${cityName}'`);
const office = division.offices[cityName];
@ -236,7 +245,7 @@ export function NetscriptCorporation(
return office;
}
function getWarehouse(divisionName: any, cityName: any): Warehouse {
function getWarehouse(divisionName: string, cityName: string): Warehouse {
const division = getDivision(divisionName);
if (!(cityName in division.warehouses)) throw new Error(`Invalid city name '${cityName}'`);
const warehouse = division.warehouses[cityName];
@ -244,7 +253,7 @@ export function NetscriptCorporation(
return warehouse;
}
function getMaterial(divisionName: any, cityName: any, materialName: any): Material {
function getMaterial(divisionName: string, cityName: string, materialName: string): Material {
const warehouse = getWarehouse(divisionName, cityName);
const matName = (materialName as string).replace(/ /g, "");
const material = warehouse.materials[matName];
@ -252,14 +261,14 @@ export function NetscriptCorporation(
return material;
}
function getProduct(divisionName: any, productName: any): Product {
function getProduct(divisionName: string, productName: string): Product {
const division = getDivision(divisionName);
const product = division.products[productName];
if (product === undefined) throw new Error(`Invalid product name: '${productName}'`);
return product;
}
function getEmployee(divisionName: any, cityName: any, employeeName: any): Employee {
function getEmployee(divisionName: string, cityName: string, employeeName: string): Employee {
const office = getOffice(divisionName, cityName);
const employee = office.employees.find((e) => e.name === employeeName);
if (employee === undefined) throw new Error(`Invalid employee name: '${employeeName}'`);
@ -302,40 +311,40 @@ export function NetscriptCorporation(
checkAccess("getPurchaseWarehouseCost", 7);
return CorporationConstants.WarehouseInitialCost;
},
getUpgradeWarehouseCost: function (adivisionName: any, acityName: any): number {
getUpgradeWarehouseCost: function (_divisionName: unknown, _cityName: unknown): number {
checkAccess("upgradeWarehouse", 7);
const divisionName = helper.string("getUpgradeWarehouseCost", "divisionName", adivisionName);
const cityName = helper.string("getUpgradeWarehouseCost", "cityName", acityName);
const divisionName = helper.string("getUpgradeWarehouseCost", "divisionName", _divisionName);
const cityName = helper.city("getUpgradeWarehouseCost", "cityName", _cityName);
const warehouse = getWarehouse(divisionName, cityName);
return CorporationConstants.WarehouseUpgradeBaseCost * Math.pow(1.07, warehouse.level + 1);
},
hasWarehouse: function (adivisionName: any, acityName: any): boolean {
hasWarehouse: function (_divisionName: unknown, _cityName: unknown): boolean {
checkAccess("hasWarehouse", 7);
const divisionName = helper.string("getWarehouse", "divisionName", adivisionName);
const cityName = helper.string("getWarehouse", "cityName", acityName);
const divisionName = helper.string("getWarehouse", "divisionName", _divisionName);
const cityName = helper.city("getWarehouse", "cityName", _cityName);
const division = getDivision(divisionName);
if (!(cityName in division.warehouses)) throw new Error(`Invalid city name '${cityName}'`);
const warehouse = division.warehouses[cityName];
return warehouse !== 0;
},
getWarehouse: function (adivisionName: any, acityName: any): NSWarehouse {
getWarehouse: function (_divisionName: unknown, _cityName: unknown): NSWarehouse {
checkAccess("getWarehouse", 7);
const divisionName = helper.string("getWarehouse", "divisionName", adivisionName);
const cityName = helper.string("getWarehouse", "cityName", acityName);
const divisionName = helper.string("getWarehouse", "divisionName", _divisionName);
const cityName = helper.city("getWarehouse", "cityName", _cityName);
const warehouse = getWarehouse(divisionName, cityName);
return {
level: warehouse.level,
loc: warehouse.loc,
size: warehouse.size,
sizeUsed: warehouse.sizeUsed,
smartSupplyEnabled: warehouse.smartSupplyEnabled
smartSupplyEnabled: warehouse.smartSupplyEnabled,
};
},
getMaterial: function (adivisionName: any, acityName: any, amaterialName: any): NSMaterial {
getMaterial: function (_divisionName: unknown, _cityName: unknown, _materialName: unknown): NSMaterial {
checkAccess("getMaterial", 7);
const divisionName = helper.string("getMaterial", "divisionName", adivisionName);
const cityName = helper.string("getMaterial", "cityName", acityName);
const materialName = helper.string("getMaterial", "materialName", amaterialName);
const divisionName = helper.string("getMaterial", "divisionName", _divisionName);
const cityName = helper.city("getMaterial", "cityName", _cityName);
const materialName = helper.string("getMaterial", "materialName", _materialName);
const material = getMaterial(divisionName, cityName, materialName);
return {
name: material.name,
@ -345,10 +354,10 @@ export function NetscriptCorporation(
sell: material.sll,
};
},
getProduct: function (adivisionName: any, aproductName: any): NSProduct {
getProduct: function (_divisionName: unknown, _productName: unknown): NSProduct {
checkAccess("getProduct", 7);
const divisionName = helper.string("getProduct", "divisionName", adivisionName);
const productName = helper.string("getProduct", "productName", aproductName);
const divisionName = helper.string("getProduct", "divisionName", _divisionName);
const productName = helper.string("getProduct", "productName", _productName);
const product = getProduct(divisionName, productName);
return {
name: product.name,
@ -360,220 +369,271 @@ export function NetscriptCorporation(
developmentProgress: product.prog,
};
},
purchaseWarehouse: function (adivisionName: any, acityName: any): void {
purchaseWarehouse: function (_divisionName: unknown, _cityName: unknown): void {
checkAccess("purchaseWarehouse", 7);
const divisionName = helper.string("purchaseWarehouse", "divisionName", adivisionName);
const cityName = helper.string("purchaseWarehouse", "cityName", acityName);
const divisionName = helper.string("purchaseWarehouse", "divisionName", _divisionName);
const cityName = helper.city("purchaseWarehouse", "cityName", _cityName);
const corporation = getCorporation();
PurchaseWarehouse(corporation, getDivision(divisionName), cityName);
},
upgradeWarehouse: function (adivisionName: any, acityName: any): void {
upgradeWarehouse: function (_divisionName: unknown, _cityName: unknown): void {
checkAccess("upgradeWarehouse", 7);
const divisionName = helper.string("upgradeWarehouse", "divisionName", adivisionName);
const cityName = helper.string("upgradeWarehouse", "cityName", acityName);
const divisionName = helper.string("upgradeWarehouse", "divisionName", _divisionName);
const cityName = helper.city("upgradeWarehouse", "cityName", _cityName);
const corporation = getCorporation();
UpgradeWarehouse(corporation, getDivision(divisionName), getWarehouse(divisionName, cityName));
},
sellMaterial: function (adivisionName: any, acityName: any, amaterialName: any, aamt: any, aprice: any): void {
sellMaterial: function (
_divisionName: unknown,
_cityName: unknown,
_materialName: unknown,
_amt: unknown,
_price: unknown,
): void {
checkAccess("sellMaterial", 7);
const divisionName = helper.string("sellMaterial", "divisionName", adivisionName);
const cityName = helper.string("sellMaterial", "cityName", acityName);
const materialName = helper.string("sellMaterial", "materialName", amaterialName);
const amt = helper.string("sellMaterial", "amt", aamt);
const price = helper.string("sellMaterial", "price", aprice);
const divisionName = helper.string("sellMaterial", "divisionName", _divisionName);
const cityName = helper.city("sellMaterial", "cityName", _cityName);
const materialName = helper.string("sellMaterial", "materialName", _materialName);
const amt = helper.string("sellMaterial", "amt", _amt);
const price = helper.string("sellMaterial", "price", _price);
const material = getMaterial(divisionName, cityName, materialName);
SellMaterial(material, amt, price);
},
sellProduct: function (
adivisionName: any,
acityName: any,
aproductName: any,
aamt: any,
aprice: any,
aall: any,
_divisionName: unknown,
_cityName: unknown,
_productName: unknown,
_amt: unknown,
_price: unknown,
_all: unknown,
): void {
checkAccess("sellProduct", 7);
const divisionName = helper.string("sellProduct", "divisionName", adivisionName);
const cityName = helper.string("sellProduct", "cityName", acityName);
const productName = helper.string("sellProduct", "productName", aproductName);
const amt = helper.string("sellProduct", "amt", aamt);
const price = helper.string("sellProduct", "price", aprice);
const all = helper.boolean(aall);
const divisionName = helper.string("sellProduct", "divisionName", _divisionName);
const cityName = helper.city("sellProduct", "cityName", _cityName);
const productName = helper.string("sellProduct", "productName", _productName);
const amt = helper.string("sellProduct", "amt", _amt);
const price = helper.string("sellProduct", "price", _price);
const all = helper.boolean(_all);
const product = getProduct(divisionName, productName);
SellProduct(product, cityName, amt, price, all);
},
discontinueProduct: function (adivisionName: any, aproductName: any): void {
discontinueProduct: function (_divisionName: unknown, _productName: unknown): void {
checkAccess("discontinueProduct", 7);
const divisionName = helper.string("discontinueProduct", "divisionName", adivisionName);
const productName = helper.string("discontinueProduct", "productName", aproductName);
const divisionName = helper.string("discontinueProduct", "divisionName", _divisionName);
const productName = helper.string("discontinueProduct", "productName", _productName);
getDivision(divisionName).discontinueProduct(getProduct(divisionName, productName));
},
setSmartSupply: function (adivisionName: any, acityName: any, aenabled: any): void {
setSmartSupply: function (_divisionName: unknown, _cityName: unknown, _enabled: unknown): void {
checkAccess("setSmartSupply", 7);
const divisionName = helper.string("setSmartSupply", "divisionName", adivisionName);
const cityName = helper.string("sellProduct", "cityName", acityName);
const enabled = helper.boolean(aenabled);
const divisionName = helper.string("setSmartSupply", "divisionName", _divisionName);
const cityName = helper.city("sellProduct", "cityName", _cityName);
const enabled = helper.boolean(_enabled);
const warehouse = getWarehouse(divisionName, cityName);
if (!hasUnlockUpgrade("Smart Supply"))
throw helper.makeRuntimeErrorMsg(`corporation.setSmartSupply`, `You have not purchased the Smart Supply upgrade!`);
throw helper.makeRuntimeErrorMsg(
`corporation.setSmartSupply`,
`You have not purchased the Smart Supply upgrade!`,
);
SetSmartSupply(warehouse, enabled);
},
setSmartSupplyUseLeftovers: function (adivisionName: any, acityName: any, amaterialName: any, aenabled: any): void {
setSmartSupplyUseLeftovers: function (
_divisionName: unknown,
_cityName: unknown,
_materialName: unknown,
_enabled: unknown,
): void {
checkAccess("setSmartSupplyUseLeftovers", 7);
const divisionName = helper.string("setSmartSupply", "divisionName", adivisionName);
const cityName = helper.string("sellProduct", "cityName", acityName);
const materialName = helper.string("sellProduct", "materialName", amaterialName);
const enabled = helper.boolean(aenabled);
const divisionName = helper.string("setSmartSupply", "divisionName", _divisionName);
const cityName = helper.city("sellProduct", "cityName", _cityName);
const materialName = helper.string("sellProduct", "materialName", _materialName);
const enabled = helper.boolean(_enabled);
const warehouse = getWarehouse(divisionName, cityName);
const material = getMaterial(divisionName, cityName, materialName);
if (!hasUnlockUpgrade("Smart Supply"))
throw helper.makeRuntimeErrorMsg(`corporation.setSmartSupply`, `You have not purchased the Smart Supply upgrade!`);
throw helper.makeRuntimeErrorMsg(
`corporation.setSmartSupply`,
`You have not purchased the Smart Supply upgrade!`,
);
SetSmartSupplyUseLeftovers(warehouse, material, enabled);
},
buyMaterial: function (adivisionName: any, acityName: any, amaterialName: any, aamt: any): void {
buyMaterial: function (_divisionName: unknown, _cityName: unknown, _materialName: unknown, _amt: unknown): void {
checkAccess("buyMaterial", 7);
const divisionName = helper.string("buyMaterial", "divisionName", adivisionName);
const cityName = helper.string("buyMaterial", "cityName", acityName);
const materialName = helper.string("buyMaterial", "materialName", amaterialName);
const amt = helper.number("buyMaterial", "amt", aamt);
const divisionName = helper.string("buyMaterial", "divisionName", _divisionName);
const cityName = helper.city("buyMaterial", "cityName", _cityName);
const materialName = helper.string("buyMaterial", "materialName", _materialName);
const amt = helper.number("buyMaterial", "amt", _amt);
if (amt < 0) throw new Error("Invalid value for amount field! Must be numeric and greater than 0");
const material = getMaterial(divisionName, cityName, materialName);
BuyMaterial(material, amt);
},
bulkPurchase: function (adivisionName: any, acityName: any, amaterialName: any, aamt: any): void {
bulkPurchase: function (_divisionName: unknown, _cityName: unknown, _materialName: unknown, _amt: unknown): void {
checkAccess("bulkPurchase", 7);
const divisionName = helper.string("bulkPurchase", "divisionName", adivisionName);
if (!hasResearched(getDivision(adivisionName), "Bulk Purchasing")) throw new Error(`You have not researched Bulk Purchasing in ${divisionName}`)
const divisionName = helper.string("bulkPurchase", "divisionName", _divisionName);
if (!hasResearched(getDivision(divisionName), "Bulk Purchasing"))
throw new Error(`You have not researched Bulk Purchasing in ${divisionName}`);
const corporation = getCorporation();
const cityName = helper.string("bulkPurchase", "cityName", acityName);
const materialName = helper.string("bulkPurchase", "materialName", amaterialName);
const amt = helper.number("bulkPurchase", "amt", aamt);
const warehouse = getWarehouse(divisionName, cityName)
const cityName = helper.city("bulkPurchase", "cityName", _cityName);
const materialName = helper.string("bulkPurchase", "materialName", _materialName);
const amt = helper.number("bulkPurchase", "amt", _amt);
const warehouse = getWarehouse(divisionName, cityName);
const material = getMaterial(divisionName, cityName, materialName);
BulkPurchase(corporation, warehouse, material, amt);
},
makeProduct: function (
adivisionName: any,
acityName: any,
aproductName: any,
adesignInvest: any,
amarketingInvest: any,
_divisionName: unknown,
_cityName: unknown,
_productName: unknown,
_designInvest: unknown,
_marketingInvest: unknown,
): void {
checkAccess("makeProduct", 7);
const divisionName = helper.string("makeProduct", "divisionName", adivisionName);
const cityName = helper.string("makeProduct", "cityName", acityName);
const productName = helper.string("makeProduct", "productName", aproductName);
const designInvest = helper.number("makeProduct", "designInvest", adesignInvest);
const marketingInvest = helper.number("makeProduct", "marketingInvest", amarketingInvest);
const divisionName = helper.string("makeProduct", "divisionName", _divisionName);
const cityName = helper.city("makeProduct", "cityName", _cityName);
const productName = helper.string("makeProduct", "productName", _productName);
const designInvest = helper.number("makeProduct", "designInvest", _designInvest);
const marketingInvest = helper.number("makeProduct", "marketingInvest", _marketingInvest);
const corporation = getCorporation();
MakeProduct(corporation, getDivision(divisionName), cityName, productName, designInvest, marketingInvest);
},
exportMaterial: function (
asourceDivision: any,
asourceCity: any,
atargetDivision: any,
atargetCity: any,
amaterialName: any,
aamt: any,
_sourceDivision: unknown,
_sourceCity: unknown,
_targetDivision: unknown,
_targetCity: unknown,
_materialName: unknown,
_amt: unknown,
): void {
checkAccess("exportMaterial", 7);
const sourceDivision = helper.string("exportMaterial", "sourceDivision", asourceDivision);
const sourceCity = helper.string("exportMaterial", "sourceCity", asourceCity);
const targetDivision = helper.string("exportMaterial", "targetDivision", atargetDivision);
const targetCity = helper.string("exportMaterial", "targetCity", atargetCity);
const materialName = helper.string("exportMaterial", "materialName", amaterialName);
const amt = helper.string("exportMaterial", "amt", aamt);
ExportMaterial(targetDivision, targetCity, getMaterial(sourceDivision, sourceCity, materialName), amt + "", getDivision(targetDivision));
const sourceDivision = helper.string("exportMaterial", "sourceDivision", _sourceDivision);
const sourceCity = helper.string("exportMaterial", "sourceCity", _sourceCity);
const targetDivision = helper.string("exportMaterial", "targetDivision", _targetDivision);
const targetCity = helper.string("exportMaterial", "targetCity", _targetCity);
const materialName = helper.string("exportMaterial", "materialName", _materialName);
const amt = helper.string("exportMaterial", "amt", _amt);
ExportMaterial(
targetDivision,
targetCity,
getMaterial(sourceDivision, sourceCity, materialName),
amt + "",
getDivision(targetDivision),
);
},
cancelExportMaterial: function (
asourceDivision: any,
asourceCity: any,
atargetDivision: any,
atargetCity: any,
amaterialName: any,
aamt: any,
_sourceDivision: unknown,
_sourceCity: unknown,
_targetDivision: unknown,
_targetCity: unknown,
_materialName: unknown,
_amt: unknown,
): void {
checkAccess("cancelExportMaterial", 7);
const sourceDivision = helper.string("cancelExportMaterial", "sourceDivision", asourceDivision);
const sourceCity = helper.string("cancelExportMaterial", "sourceCity", asourceCity);
const targetDivision = helper.string("cancelExportMaterial", "targetDivision", atargetDivision);
const targetCity = helper.string("cancelExportMaterial", "targetCity", atargetCity);
const materialName = helper.string("cancelExportMaterial", "materialName", amaterialName);
const amt = helper.string("cancelExportMaterial", "amt", aamt);
const sourceDivision = helper.string("cancelExportMaterial", "sourceDivision", _sourceDivision);
const sourceCity = helper.string("cancelExportMaterial", "sourceCity", _sourceCity);
const targetDivision = helper.string("cancelExportMaterial", "targetDivision", _targetDivision);
const targetCity = helper.string("cancelExportMaterial", "targetCity", _targetCity);
const materialName = helper.string("cancelExportMaterial", "materialName", _materialName);
const amt = helper.string("cancelExportMaterial", "amt", _amt);
CancelExportMaterial(targetDivision, targetCity, getMaterial(sourceDivision, sourceCity, materialName), amt + "");
},
setMaterialMarketTA1: function (adivisionName: any, acityName: any, amaterialName: any, aon: any): void {
setMaterialMarketTA1: function (
_divisionName: unknown,
_cityName: unknown,
_materialName: unknown,
_on: unknown,
): void {
checkAccess("setMaterialMarketTA1", 7);
const divisionName = helper.string("setMaterialMarketTA1", "divisionName", adivisionName);
const cityName = helper.string("setMaterialMarketTA1", "cityName", acityName);
const materialName = helper.string("setMaterialMarketTA1", "materialName", amaterialName);
const on = helper.boolean(aon);
const divisionName = helper.string("setMaterialMarketTA1", "divisionName", _divisionName);
const cityName = helper.city("setMaterialMarketTA1", "cityName", _cityName);
const materialName = helper.string("setMaterialMarketTA1", "materialName", _materialName);
const on = helper.boolean(_on);
if (!getDivision(divisionName).hasResearch("Market-TA.I"))
throw helper.makeRuntimeErrorMsg(`corporation.setMaterialMarketTA1`, `You have not researched MarketTA.I for division: ${divisionName}`);
throw helper.makeRuntimeErrorMsg(
`corporation.setMaterialMarketTA1`,
`You have not researched MarketTA.I for division: ${divisionName}`,
);
SetMaterialMarketTA1(getMaterial(divisionName, cityName, materialName), on);
},
setMaterialMarketTA2: function (adivisionName: any, acityName: any, amaterialName: any, aon: any): void {
setMaterialMarketTA2: function (
_divisionName: unknown,
_cityName: unknown,
_materialName: unknown,
_on: unknown,
): void {
checkAccess("setMaterialMarketTA2", 7);
const divisionName = helper.string("setMaterialMarketTA2", "divisionName", adivisionName);
const cityName = helper.string("setMaterialMarketTA2", "cityName", acityName);
const materialName = helper.string("setMaterialMarketTA2", "materialName", amaterialName);
const on = helper.boolean(aon);
const divisionName = helper.string("setMaterialMarketTA2", "divisionName", _divisionName);
const cityName = helper.city("setMaterialMarketTA2", "cityName", _cityName);
const materialName = helper.string("setMaterialMarketTA2", "materialName", _materialName);
const on = helper.boolean(_on);
if (!getDivision(divisionName).hasResearch("Market-TA.II"))
throw helper.makeRuntimeErrorMsg(`corporation.setMaterialMarketTA2`, `You have not researched MarketTA.II for division: ${divisionName}`);
throw helper.makeRuntimeErrorMsg(
`corporation.setMaterialMarketTA2`,
`You have not researched MarketTA.II for division: ${divisionName}`,
);
SetMaterialMarketTA2(getMaterial(divisionName, cityName, materialName), on);
},
setProductMarketTA1: function (adivisionName: any, aproductName: any, aon: any): void {
setProductMarketTA1: function (_divisionName: unknown, _productName: unknown, _on: unknown): void {
checkAccess("setProductMarketTA1", 7);
const divisionName = helper.string("setProductMarketTA1", "divisionName", adivisionName);
const productName = helper.string("setProductMarketTA1", "productName", aproductName);
const on = helper.boolean(aon);
const divisionName = helper.string("setProductMarketTA1", "divisionName", _divisionName);
const productName = helper.string("setProductMarketTA1", "productName", _productName);
const on = helper.boolean(_on);
if (!getDivision(divisionName).hasResearch("Market-TA.I"))
throw helper.makeRuntimeErrorMsg(`corporation.setProductMarketTA1`, `You have not researched MarketTA.I for division: ${divisionName}`);
throw helper.makeRuntimeErrorMsg(
`corporation.setProductMarketTA1`,
`You have not researched MarketTA.I for division: ${divisionName}`,
);
SetProductMarketTA1(getProduct(divisionName, productName), on);
},
setProductMarketTA2: function (adivisionName: any, aproductName: any, aon: any): void {
setProductMarketTA2: function (_divisionName: unknown, _productName: unknown, _on: unknown): void {
checkAccess("setProductMarketTA2", 7);
const divisionName = helper.string("setProductMarketTA2", "divisionName", adivisionName);
const productName = helper.string("setProductMarketTA2", "productName", aproductName);
const on = helper.boolean(aon);
const divisionName = helper.string("setProductMarketTA2", "divisionName", _divisionName);
const productName = helper.string("setProductMarketTA2", "productName", _productName);
const on = helper.boolean(_on);
if (!getDivision(divisionName).hasResearch("Market-TA.II"))
throw helper.makeRuntimeErrorMsg(`corporation.setProductMarketTA2`, `You have not researched MarketTA.II for division: ${divisionName}`);
throw helper.makeRuntimeErrorMsg(
`corporation.setProductMarketTA2`,
`You have not researched MarketTA.II for division: ${divisionName}`,
);
SetProductMarketTA2(getProduct(divisionName, productName), on);
},
};
const officeAPI: OfficeAPI = {
getHireAdVertCost: function (adivisionName: any): number {
getHireAdVertCost: function (_divisionName: unknown): number {
checkAccess("getHireAdVertCost", 8);
const divisionName = helper.string("getHireAdVertCost", "divisionName", adivisionName);
const divisionName = helper.string("getHireAdVertCost", "divisionName", _divisionName);
const division = getDivision(divisionName);
const upgrade = IndustryUpgrades[1];
return upgrade[1] * Math.pow(upgrade[2], division.upgrades[1]);
},
getHireAdVertCount: function (adivisionName: any): number {
getHireAdVertCount: function (_divisionName: unknown): number {
checkAccess("getHireAdVertCount", 8);
const divisionName = helper.string("getHireAdVertCount", "divisionName", adivisionName);
const divisionName = helper.string("getHireAdVertCount", "divisionName", _divisionName);
const division = getDivision(divisionName);
return division.upgrades[1]
return division.upgrades[1];
},
getResearchCost: function (adivisionName: any, aresearchName: any): number {
getResearchCost: function (_divisionName: unknown, _researchName: unknown): number {
checkAccess("getResearchCost", 8);
const divisionName = helper.string("getResearchCost", "divisionName", adivisionName);
const researchName = helper.string("getResearchCost", "researchName", aresearchName);
const divisionName = helper.string("getResearchCost", "divisionName", _divisionName);
const researchName = helper.string("getResearchCost", "researchName", _researchName);
return getResearchCost(getDivision(divisionName), researchName);
},
hasResearched: function (adivisionName: any, aresearchName: any): boolean {
hasResearched: function (_divisionName: unknown, _researchName: unknown): boolean {
checkAccess("hasResearched", 8);
const divisionName = helper.string("hasResearched", "divisionName", adivisionName);
const researchName = helper.string("hasResearched", "researchName", aresearchName);
const divisionName = helper.string("hasResearched", "divisionName", _divisionName);
const researchName = helper.string("hasResearched", "researchName", _researchName);
return hasResearched(getDivision(divisionName), researchName);
},
setAutoJobAssignment: function (adivisionName: any, acityName: any, ajob: any, aamount: any): Promise<boolean> {
setAutoJobAssignment: function (
_divisionName: unknown,
_cityName: unknown,
_job: unknown,
_amount: unknown,
): Promise<boolean> {
checkAccess("setAutoJobAssignment", 8);
const divisionName = helper.string("setAutoJobAssignment", "divisionName", adivisionName);
const cityName = helper.string("setAutoJobAssignment", "cityName", acityName);
const amount = helper.number("setAutoJobAssignment", "amount", aamount);
const job = helper.string("setAutoJobAssignment", "job", ajob);
const divisionName = helper.string("setAutoJobAssignment", "divisionName", _divisionName);
const cityName = helper.city("setAutoJobAssignment", "cityName", _cityName);
const amount = helper.number("setAutoJobAssignment", "amount", _amount);
const job = helper.string("setAutoJobAssignment", "job", _job);
const office = getOffice(divisionName, cityName);
if (!Object.values(EmployeePositions).includes(job)) throw new Error(`'${job}' is not a valid job.`);
return netscriptDelay(1000, workerScript).then(function () {
@ -583,11 +643,11 @@ export function NetscriptCorporation(
return Promise.resolve(office.setEmployeeToJob(job, amount));
});
},
getOfficeSizeUpgradeCost: function (adivisionName: any, acityName: any, asize: any): number {
getOfficeSizeUpgradeCost: function (_divisionName: unknown, _cityName: unknown, _size: unknown): number {
checkAccess("getOfficeSizeUpgradeCost", 8);
const divisionName = helper.string("getOfficeSizeUpgradeCost", "divisionName", adivisionName);
const cityName = helper.string("getOfficeSizeUpgradeCost", "cityName", acityName);
const size = helper.number("getOfficeSizeUpgradeCost", "size", asize);
const divisionName = helper.string("getOfficeSizeUpgradeCost", "divisionName", _divisionName);
const cityName = helper.city("getOfficeSizeUpgradeCost", "cityName", _cityName);
const size = helper.number("getOfficeSizeUpgradeCost", "size", _size);
if (size < 0) throw new Error("Invalid value for size field! Must be numeric and greater than 0");
const office = getOffice(divisionName, cityName);
const initialPriceMult = Math.round(office.size / CorporationConstants.OfficeInitialSize);
@ -598,40 +658,46 @@ export function NetscriptCorporation(
}
return CorporationConstants.OfficeInitialCost * mult;
},
assignJob: function (adivisionName: any, acityName: any, aemployeeName: any, ajob: any): Promise<void> {
assignJob: function (
_divisionName: unknown,
_cityName: unknown,
_employeeName: unknown,
_job: unknown,
): Promise<void> {
checkAccess("assignJob", 8);
const divisionName = helper.string("assignJob", "divisionName", adivisionName);
const cityName = helper.string("assignJob", "cityName", acityName);
const employeeName = helper.string("assignJob", "employeeName", aemployeeName);
const job = helper.string("assignJob", "job", ajob);
const divisionName = helper.string("assignJob", "divisionName", _divisionName);
const cityName = helper.city("assignJob", "cityName", _cityName);
const employeeName = helper.string("assignJob", "employeeName", _employeeName);
const job = helper.string("assignJob", "job", _job);
const employee = getEmployee(divisionName, cityName, employeeName);
return netscriptDelay(1000, workerScript).then(function () {
return Promise.resolve(AssignJob(employee, job));
});
},
hireEmployee: function (adivisionName: any, acityName: any): any {
hireEmployee: function (_divisionName: unknown, _cityName: unknown): any {
checkAccess("hireEmployee", 8);
const divisionName = helper.string("hireEmployee", "divisionName", adivisionName);
const cityName = helper.string("hireEmployee", "cityName", acityName);
const divisionName = helper.string("hireEmployee", "divisionName", _divisionName);
const cityName = helper.city("hireEmployee", "cityName", _cityName);
const office = getOffice(divisionName, cityName);
return office.hireRandomEmployee();
},
upgradeOfficeSize: function (adivisionName: any, acityName: any, asize: any): void {
upgradeOfficeSize: function (_divisionName: unknown, _cityName: unknown, _size: unknown): void {
checkAccess("upgradeOfficeSize", 8);
const divisionName = helper.string("upgradeOfficeSize", "divisionName", adivisionName);
const cityName = helper.string("upgradeOfficeSize", "cityName", acityName);
const size = helper.number("upgradeOfficeSize", "size", asize);
const divisionName = helper.string("upgradeOfficeSize", "divisionName", _divisionName);
const cityName = helper.city("upgradeOfficeSize", "cityName", _cityName);
const size = helper.number("upgradeOfficeSize", "size", _size);
if (size < 0) throw new Error("Invalid value for size field! Must be numeric and greater than 0");
const office = getOffice(divisionName, cityName);
const corporation = getCorporation();
UpgradeOfficeSize(corporation, office, size);
},
throwParty: function (adivisionName: any, acityName: any, acostPerEmployee: any): Promise<number> {
throwParty: function (_divisionName: unknown, _cityName: unknown, _costPerEmployee: unknown): Promise<number> {
checkAccess("throwParty", 8);
const divisionName = helper.string("throwParty", "divisionName", adivisionName);
const cityName = helper.string("throwParty", "cityName", acityName);
const costPerEmployee = helper.number("throwParty", "costPerEmployee", acostPerEmployee);
if (costPerEmployee < 0) throw new Error("Invalid value for Cost Per Employee field! Must be numeric and greater than 0");
const divisionName = helper.string("throwParty", "divisionName", _divisionName);
const cityName = helper.city("throwParty", "cityName", _cityName);
const costPerEmployee = helper.number("throwParty", "costPerEmployee", _costPerEmployee);
if (costPerEmployee < 0)
throw new Error("Invalid value for Cost Per Employee field! Must be numeric and greater than 0");
const office = getOffice(divisionName, cityName);
const corporation = getCorporation();
return netscriptDelay(
@ -641,10 +707,10 @@ export function NetscriptCorporation(
return Promise.resolve(ThrowParty(corporation, office, costPerEmployee));
});
},
buyCoffee: function (adivisionName: any, acityName: any): Promise<void> {
buyCoffee: function (_divisionName: unknown, _cityName: unknown): Promise<void> {
checkAccess("buyCoffee", 8);
const divisionName = helper.string("buyCoffee", "divisionName", adivisionName);
const cityName = helper.string("buyCoffee", "cityName", acityName);
const divisionName = helper.string("buyCoffee", "divisionName", _divisionName);
const cityName = helper.city("buyCoffee", "cityName", _cityName);
const corporation = getCorporation();
return netscriptDelay(
(60 * 1000) / (player.hacking_speed_mult * calculateIntelligenceBonus(player.intelligence, 1)),
@ -653,22 +719,22 @@ export function NetscriptCorporation(
return Promise.resolve(BuyCoffee(corporation, getDivision(divisionName), getOffice(divisionName, cityName)));
});
},
hireAdVert: function (adivisionName: any): void {
hireAdVert: function (_divisionName: unknown): void {
checkAccess("hireAdVert", 8);
const divisionName = helper.string("hireAdVert", "divisionName", adivisionName);
const divisionName = helper.string("hireAdVert", "divisionName", _divisionName);
const corporation = getCorporation();
HireAdVert(corporation, getDivision(divisionName), getOffice(divisionName, "Sector-12"));
},
research: function (adivisionName: any, aresearchName: any): void {
research: function (_divisionName: unknown, _researchName: unknown): void {
checkAccess("research", 8);
const divisionName = helper.string("research", "divisionName", adivisionName);
const researchName = helper.string("research", "researchName", aresearchName);
const divisionName = helper.string("research", "divisionName", _divisionName);
const researchName = helper.string("research", "researchName", _researchName);
Research(getDivision(divisionName), researchName);
},
getOffice: function (adivisionName: any, acityName: any): any {
getOffice: function (_divisionName: unknown, _cityName: unknown): any {
checkAccess("getOffice", 8);
const divisionName = helper.string("getOffice", "divisionName", adivisionName);
const cityName = helper.string("getOffice", "cityName", acityName);
const divisionName = helper.string("getOffice", "divisionName", _divisionName);
const cityName = helper.city("getOffice", "cityName", _cityName);
const office = getOffice(divisionName, cityName);
return {
loc: office.loc,
@ -689,11 +755,11 @@ export function NetscriptCorporation(
},
};
},
getEmployee: function (adivisionName: any, acityName: any, aemployeeName: any): NSEmployee {
getEmployee: function (_divisionName: unknown, _cityName: unknown, _employeeName: unknown): NSEmployee {
checkAccess("getEmployee", 8);
const divisionName = helper.string("getEmployee", "divisionName", adivisionName);
const cityName = helper.string("getEmployee", "cityName", acityName);
const employeeName = helper.string("getEmployee", "employeeName", aemployeeName);
const divisionName = helper.string("getEmployee", "divisionName", _divisionName);
const cityName = helper.city("getEmployee", "cityName", _cityName);
const employeeName = helper.string("getEmployee", "employeeName", _employeeName);
const employee = getEmployee(divisionName, cityName, employeeName);
return {
name: employee.name,
@ -715,42 +781,43 @@ export function NetscriptCorporation(
return {
...warehouseAPI,
...officeAPI,
expandIndustry: function (aindustryName: any, adivisionName: any): void {
expandIndustry: function (_industryName: unknown, _divisionName: unknown): void {
checkAccess("expandIndustry");
const industryName = helper.string("expandIndustry", "industryName", aindustryName);
const divisionName = helper.string("expandIndustry", "divisionName", adivisionName);
const industryName = helper.string("expandIndustry", "industryName", _industryName);
const divisionName = helper.string("expandIndustry", "divisionName", _divisionName);
const corporation = getCorporation();
NewIndustry(corporation, industryName, divisionName);
},
expandCity: function (adivisionName: any, acityName: any): void {
expandCity: function (_divisionName: unknown, _cityName: unknown): void {
checkAccess("expandCity");
const divisionName = helper.string("expandCity", "divisionName", adivisionName);
const cityName = helper.string("expandCity", "cityName", acityName);
const divisionName = helper.string("expandCity", "divisionName", _divisionName);
const cityName = helper.city("expandCity", "cityName", _cityName);
if (!CorporationConstants.Cities.includes(cityName)) throw new Error("Invalid city name");
const corporation = getCorporation();
const division = getDivision(divisionName);
NewCity(corporation, division, cityName);
},
unlockUpgrade: function (aupgradeName: any): void {
unlockUpgrade: function (_upgradeName: unknown): void {
checkAccess("unlockUpgrade");
const upgradeName = helper.string("unlockUpgrade", "upgradeName", aupgradeName);
const upgradeName = helper.string("unlockUpgrade", "upgradeName", _upgradeName);
const corporation = getCorporation();
const upgrade = Object.values(CorporationUnlockUpgrades).find((upgrade) => upgrade[2] === upgradeName);
if (upgrade === undefined) throw new Error(`No upgrade named '${upgradeName}'`);
UnlockUpgrade(corporation, upgrade);
},
levelUpgrade: function (aupgradeName: any): void {
levelUpgrade: function (_upgradeName: unknown): void {
checkAccess("levelUpgrade");
const upgradeName = helper.string("levelUpgrade", "upgradeName", aupgradeName);
const upgradeName = helper.string("levelUpgrade", "upgradeName", _upgradeName);
const corporation = getCorporation();
const upgrade = Object.values(CorporationUpgrades).find((upgrade) => upgrade[4] === upgradeName);
if (upgrade === undefined) throw new Error(`No upgrade named '${upgradeName}'`);
LevelUpgrade(corporation, upgrade);
},
issueDividends: function (apercent: any): void {
issueDividends: function (_percent: unknown): void {
checkAccess("issueDividends");
const percent = helper.number("issueDividends", "percent", apercent);
if (percent < 0 || percent > 100) throw new Error("Invalid value for percent field! Must be numeric, greater than 0, and less than 100");
const percent = helper.number("issueDividends", "percent", _percent);
if (percent < 0 || percent > 100)
throw new Error("Invalid value for percent field! Must be numeric, greater than 0, and less than 100");
const corporation = getCorporation();
if (!corporation.public)
throw helper.makeRuntimeErrorMsg(`corporation.issueDividends`, `Your company has not gone public!`);
@ -759,9 +826,9 @@ export function NetscriptCorporation(
// If you modify these objects you will affect them for real, it's not
// copies.
getDivision: function (adivisionName: any): NSDivision {
getDivision: function (_divisionName: unknown): NSDivision {
checkAccess("getDivision");
const divisionName = helper.string("getDivision", "divisionName", adivisionName);
const divisionName = helper.string("getDivision", "divisionName", _divisionName);
const division = getDivision(divisionName);
return getSafeDivision(division);
},
@ -783,33 +850,34 @@ export function NetscriptCorporation(
divisions: corporation.divisions.map((division): NSDivision => getSafeDivision(division)),
};
},
createCorporation: function (acorporationName: string, selfFund = true): boolean {
const corporationName = helper.string("createCorporation", "corporationName", acorporationName);
createCorporation: function (_corporationName: unknown, _selfFund: unknown = true): boolean {
const corporationName = helper.string("createCorporation", "corporationName", _corporationName);
const selfFund = helper.boolean(_selfFund);
return createCorporation(corporationName, selfFund);
},
hasUnlockUpgrade: function (aupgradeName: any): boolean {
hasUnlockUpgrade: function (_upgradeName: unknown): boolean {
checkAccess("hasUnlockUpgrade");
const upgradeName = helper.string("hasUnlockUpgrade", "upgradeName", aupgradeName);
const upgradeName = helper.string("hasUnlockUpgrade", "upgradeName", _upgradeName);
return hasUnlockUpgrade(upgradeName);
},
getUnlockUpgradeCost: function (aupgradeName: any): number {
getUnlockUpgradeCost: function (_upgradeName: unknown): number {
checkAccess("getUnlockUpgradeCost");
const upgradeName = helper.string("getUnlockUpgradeCost", "upgradeName", aupgradeName);
const upgradeName = helper.string("getUnlockUpgradeCost", "upgradeName", _upgradeName);
return getUnlockUpgradeCost(upgradeName);
},
getUpgradeLevel: function (aupgradeName: any): number {
getUpgradeLevel: function (_upgradeName: unknown): number {
checkAccess("hasUnlockUpgrade");
const upgradeName = helper.string("getUpgradeLevel", "upgradeName", aupgradeName);
const upgradeName = helper.string("getUpgradeLevel", "upgradeName", _upgradeName);
return getUpgradeLevel(upgradeName);
},
getUpgradeLevelCost: function (aupgradeName: any): number {
getUpgradeLevelCost: function (_upgradeName: unknown): number {
checkAccess("getUpgradeLevelCost");
const upgradeName = helper.string("getUpgradeLevelCost", "upgradeName", aupgradeName);
const upgradeName = helper.string("getUpgradeLevelCost", "upgradeName", _upgradeName);
return getUpgradeLevelCost(upgradeName);
},
getExpandIndustryCost: function (aindustryName: any): number {
getExpandIndustryCost: function (_industryName: unknown): number {
checkAccess("getExpandIndustryCost");
const industryName = helper.string("getExpandIndustryCost", "industryName", aindustryName);
const industryName = helper.string("getExpandIndustryCost", "industryName", _industryName);
return getExpandIndustryCost(industryName);
},
getExpandCityCost: function (): number {
@ -824,31 +892,31 @@ export function NetscriptCorporation(
checkAccess("acceptInvestmentOffer");
return acceptInvestmentOffer();
},
goPublic: function (anumShares: any): boolean {
goPublic: function (_numShares: unknown): boolean {
checkAccess("acceptInvestmentOffer");
const numShares = helper.number("goPublic", "numShares", anumShares);
const numShares = helper.number("goPublic", "numShares", _numShares);
return goPublic(numShares);
},
sellShares: function (anumShares: any): number {
sellShares: function (_numShares: unknown): number {
checkAccess("acceptInvestmentOffer");
const numShares = helper.number("sellStock", "numShares", anumShares);
const numShares = helper.number("sellStock", "numShares", _numShares);
return SellShares(getCorporation(), player, numShares);
},
buyBackShares: function (anumShares: any): boolean {
buyBackShares: function (_numShares: unknown): boolean {
checkAccess("acceptInvestmentOffer");
const numShares = helper.number("buyStock", "numShares", anumShares);
const numShares = helper.number("buyStock", "numShares", _numShares);
return BuyBackShares(getCorporation(), player, numShares);
},
bribe: function (afactionName: string, aamountCash: any, aamountShares: any): boolean {
bribe: function (_factionName: unknown, _amountCash: unknown, _amountShares: unknown): boolean {
checkAccess("bribe");
const factionName = helper.string("bribe", "factionName", afactionName);
const amountCash = helper.number("bribe", "amountCash", aamountCash);
const amountShares = helper.number("bribe", "amountShares", aamountShares);
const factionName = helper.string("bribe", "factionName", _factionName);
const amountCash = helper.number("bribe", "amountCash", _amountCash);
const amountShares = helper.number("bribe", "amountShares", _amountShares);
return bribe(factionName, amountCash, amountShares);
},
getBonusTime: function (): number {
checkAccess("getBonusTime");
return Math.round(getCorporation().storedCycles / 5) * 1000;
}
},
};
}

@ -1,5 +1,5 @@
import { FactionNames } from '../Faction/data/FactionNames';
import { GangConstants } from '../Gang/data/Constants';
import { FactionNames } from "../Faction/data/FactionNames";
import { GangConstants } from "../Gang/data/Constants";
import { INetscriptHelper } from "./INetscriptHelper";
import { IPlayer } from "../PersonObjects/IPlayer";
import { getRamCost } from "../Netscript/RamCostGenerator";
@ -48,7 +48,8 @@ export function NetscriptGang(player: IPlayer, workerScript: WorkerScript, helpe
};
return {
createGang: function (faction: string): boolean {
createGang: function (_faction: unknown): boolean {
const faction = helper.string("createGang", "faction", _faction);
helper.updateDynamicRam("createGang", getRamCost(player, "gang", "createGang"));
// this list is copied from Faction/ui/Root.tsx
@ -101,12 +102,13 @@ export function NetscriptGang(player: IPlayer, workerScript: WorkerScript, helpe
return cpy;
},
getMemberInformation: function (name: any): GangMemberInfo {
getMemberInformation: function (_memberName: unknown): GangMemberInfo {
const memberName = helper.string("getMemberInformation", "memberName", _memberName);
helper.updateDynamicRam("getMemberInformation", getRamCost(player, "gang", "getMemberInformation"));
checkGangApiAccess("getMemberInformation");
const gang = player.gang;
if (gang === null) throw new Error("Should not be called without Gang");
const member = getGangMember("getMemberInformation", name);
const member = getGangMember("getMemberInformation", memberName);
return {
name: member.name,
task: member.task,
@ -161,16 +163,17 @@ export function NetscriptGang(player: IPlayer, workerScript: WorkerScript, helpe
if (gang === null) throw new Error("Should not be called without Gang");
return gang.canRecruitMember();
},
recruitMember: function (name: any): boolean {
recruitMember: function (_memberName: unknown): boolean {
const memberName = helper.string("recruitMember", "memberName", _memberName);
helper.updateDynamicRam("recruitMember", getRamCost(player, "gang", "recruitMember"));
checkGangApiAccess("recruitMember");
const gang = player.gang;
if (gang === null) throw new Error("Should not be called without Gang");
const recruited = gang.recruitMember(name);
const recruited = gang.recruitMember(memberName);
if (recruited) {
workerScript.log("gang.recruitMember", () => `Successfully recruited Gang Member '${name}'`);
workerScript.log("gang.recruitMember", () => `Successfully recruited Gang Member '${memberName}'`);
} else {
workerScript.log("gang.recruitMember", () => `Failed to recruit Gang Member '${name}'`);
workerScript.log("gang.recruitMember", () => `Failed to recruit Gang Member '${memberName}'`);
}
return recruited;
@ -184,7 +187,9 @@ export function NetscriptGang(player: IPlayer, workerScript: WorkerScript, helpe
tasks.unshift("Unassigned");
return tasks;
},
setMemberTask: function (memberName: any, taskName: any): boolean {
setMemberTask: function (_memberName: unknown, _taskName: unknown): boolean {
const memberName = helper.string("setMemberTask", "memberName", _memberName);
const taskName = helper.string("setMemberTask", "taskName", _taskName);
helper.updateDynamicRam("setMemberTask", getRamCost(player, "gang", "setMemberTask"));
checkGangApiAccess("setMemberTask");
const member = getGangMember("setMemberTask", memberName);
@ -193,9 +198,10 @@ export function NetscriptGang(player: IPlayer, workerScript: WorkerScript, helpe
if (!gang.getAllTaskNames().includes(taskName)) {
workerScript.log(
"gang.setMemberTask",
() => `Failed to assign Gang Member '${memberName}' to Invalid task '${taskName}'. '${memberName}' is now Unassigned`,
() =>
`Failed to assign Gang Member '${memberName}' to Invalid task '${taskName}'. '${memberName}' is now Unassigned`,
);
return member.assignToTask('Unassigned');
return member.assignToTask("Unassigned");
}
const success = member.assignToTask(taskName);
if (success) {
@ -212,7 +218,8 @@ export function NetscriptGang(player: IPlayer, workerScript: WorkerScript, helpe
return success;
},
getTaskStats: function (taskName: any): GangTaskStats {
getTaskStats: function (_taskName: unknown): GangTaskStats {
const taskName = helper.string("getTaskStats", "taskName", _taskName);
helper.updateDynamicRam("getTaskStats", getRamCost(player, "gang", "getTaskStats"));
checkGangApiAccess("getTaskStats");
const task = getGangTask("getTaskStats", taskName);
@ -225,7 +232,8 @@ export function NetscriptGang(player: IPlayer, workerScript: WorkerScript, helpe
checkGangApiAccess("getEquipmentNames");
return Object.keys(GangMemberUpgrades);
},
getEquipmentCost: function (equipName: any): number {
getEquipmentCost: function (_equipName: any): number {
const equipName = helper.string("getEquipmentCost", "equipName", _equipName);
helper.updateDynamicRam("getEquipmentCost", getRamCost(player, "gang", "getEquipmentCost"));
checkGangApiAccess("getEquipmentCost");
const gang = player.gang;
@ -234,14 +242,16 @@ export function NetscriptGang(player: IPlayer, workerScript: WorkerScript, helpe
if (upg === null) return Infinity;
return gang.getUpgradeCost(upg);
},
getEquipmentType: function (equipName: any): string {
getEquipmentType: function (_equipName: unknown): string {
const equipName = helper.string("getEquipmentType", "equipName", _equipName);
helper.updateDynamicRam("getEquipmentType", getRamCost(player, "gang", "getEquipmentType"));
checkGangApiAccess("getEquipmentType");
const upg = GangMemberUpgrades[equipName];
if (upg == null) return "";
return upg.getType();
},
getEquipmentStats: function (equipName: any): EquipmentStats {
getEquipmentStats: function (_equipName: unknown): EquipmentStats {
const equipName = helper.string("getEquipmentStats", "equipName", _equipName);
helper.updateDynamicRam("getEquipmentStats", getRamCost(player, "gang", "getEquipmentStats"));
checkGangApiAccess("getEquipmentStats");
const equipment = GangMemberUpgrades[equipName];
@ -251,7 +261,9 @@ export function NetscriptGang(player: IPlayer, workerScript: WorkerScript, helpe
const typecheck: EquipmentStats = equipment.mults;
return Object.assign({}, typecheck) as any;
},
purchaseEquipment: function (memberName: any, equipName: any): boolean {
purchaseEquipment: function (_memberName: unknown, _equipName: unknown): boolean {
const memberName = helper.string("purchaseEquipment", "memberName", _memberName);
const equipName = helper.string("purchaseEquipment", "equipName", _equipName);
helper.updateDynamicRam("purchaseEquipment", getRamCost(player, "gang", "purchaseEquipment"));
checkGangApiAccess("purchaseEquipment");
const gang = player.gang;
@ -271,28 +283,31 @@ export function NetscriptGang(player: IPlayer, workerScript: WorkerScript, helpe
return res;
},
ascendMember: function (name: any): GangMemberAscension | undefined {
ascendMember: function (_memberName: unknown): GangMemberAscension | undefined {
const memberName = helper.string("ascendMember", "memberName", _memberName);
helper.updateDynamicRam("ascendMember", getRamCost(player, "gang", "ascendMember"));
checkGangApiAccess("ascendMember");
const gang = player.gang;
if (gang === null) throw new Error("Should not be called without Gang");
const member = getGangMember("ascendMember", name);
const member = getGangMember("ascendMember", memberName);
if (!member.canAscend()) return;
return gang.ascendMember(member, workerScript);
},
getAscensionResult: function (name: any): GangMemberAscension | undefined {
getAscensionResult: function (_memberName: unknown): GangMemberAscension | undefined {
const memberName = helper.string("getAscensionResult", "memberName", _memberName);
helper.updateDynamicRam("getAscensionResult", getRamCost(player, "gang", "getAscensionResult"));
checkGangApiAccess("getAscensionResult");
const gang = player.gang;
if (gang === null) throw new Error("Should not be called without Gang");
const member = getGangMember("getAscensionResult", name);
const member = getGangMember("getAscensionResult", memberName);
if (!member.canAscend()) return;
return {
respect: member.earnedRespect,
...member.getAscensionResults(),
};
},
setTerritoryWarfare: function (engage: any): void {
setTerritoryWarfare: function (_engage: unknown): void {
const engage = helper.boolean(_engage);
helper.updateDynamicRam("setTerritoryWarfare", getRamCost(player, "gang", "setTerritoryWarfare"));
checkGangApiAccess("setTerritoryWarfare");
const gang = player.gang;
@ -305,7 +320,8 @@ export function NetscriptGang(player: IPlayer, workerScript: WorkerScript, helpe
workerScript.log("gang.setTerritoryWarfare", () => "Disengaging in Gang Territory Warfare");
}
},
getChanceToWinClash: function (otherGang: any): number {
getChanceToWinClash: function (_otherGang: unknown): number {
const otherGang = helper.string("getChanceToWinClash", "otherGang", _otherGang);
helper.updateDynamicRam("getChanceToWinClash", getRamCost(player, "gang", "getChanceToWinClash"));
checkGangApiAccess("getChanceToWinClash");
const gang = player.gang;

@ -1,3 +1,4 @@
import { CityName } from "src/Locations/data/CityNames";
import { BaseServer } from "../Server/BaseServer";
export interface INetscriptHelper {
@ -5,6 +6,7 @@ export interface INetscriptHelper {
makeRuntimeErrorMsg(functionName: string, message: string): void;
string(funcName: string, argName: string, v: unknown): string;
number(funcName: string, argName: string, v: unknown): number;
city(funcName: string, argName: string, v: unknown): CityName;
boolean(v: unknown): boolean;
getServer(ip: any, fn: any): BaseServer;
checkSingularityAccess(func: string): void;

@ -1,7 +1,7 @@
import { INetscriptHelper } from "./INetscriptHelper";
import { WorkerScript } from "../Netscript/WorkerScript";
import { IPlayer } from "../PersonObjects/IPlayer";
import { purchaseAugmentation, joinFaction } from "../Faction/FactionHelpers";
import { purchaseAugmentation, joinFaction, getFactionAugmentationsFiltered } from "../Faction/FactionHelpers";
import { startWorkerScript } from "../NetscriptWorker";
import { Augmentation } from "../Augmentation/Augmentation";
import { Augmentations } from "../Augmentation/Augmentations";
@ -14,7 +14,13 @@ import { isString } from "../utils/helpers/isString";
import { getRamCost } from "../Netscript/RamCostGenerator";
import { RunningScript } from "../Script/RunningScript";
import { Singularity as ISingularity } from "../ScriptEditor/NetscriptDefinitions";
import {
AugmentationStats,
CharacterInfo,
CrimeStats,
PlayerSkills,
Singularity as ISingularity,
} from "../ScriptEditor/NetscriptDefinitions";
import { findCrime } from "../Crime/CrimeHelpers";
import { CompanyPosition } from "../Company/CompanyPosition";
@ -49,7 +55,7 @@ export function NetscriptSingularity(
workerScript: WorkerScript,
helper: INetscriptHelper,
): ISingularity {
const getAugmentation = function (func: any, name: any): Augmentation {
const getAugmentation = function (func: string, name: string): Augmentation {
if (!augmentationExists(name)) {
throw helper.makeRuntimeErrorMsg(func, `Invalid augmentation: '${name}'`);
}
@ -57,7 +63,7 @@ export function NetscriptSingularity(
return Augmentations[name];
};
const getFaction = function (func: any, name: any): Faction {
const getFaction = function (func: string, name: string): Faction {
if (!factionExists(name)) {
throw helper.makeRuntimeErrorMsg(func, `Invalid faction name: '${name}`);
}
@ -65,7 +71,7 @@ export function NetscriptSingularity(
return Factions[name];
};
const getCompany = function (func: any, name: any): Company {
const getCompany = function (func: string, name: string): Company {
const company = Companies[name];
if (company == null || !(company instanceof Company)) {
throw helper.makeRuntimeErrorMsg(func, `Invalid company name: '${name}'`);
@ -73,26 +79,26 @@ export function NetscriptSingularity(
return company;
};
const runAfterReset = function (cbScript = null): void {
const runAfterReset = function (cbScript: string | null = null): void {
//Run a script after reset
if (cbScript && isString(cbScript)) {
const home = player.getHomeComputer();
for (const script of home.scripts) {
if (script.filename === cbScript) {
const ramUsage = script.ramUsage;
const ramAvailable = home.maxRam - home.ramUsed;
if (ramUsage > ramAvailable) {
return; // Not enough RAM
}
const runningScriptObj = new RunningScript(script, []); // No args
runningScriptObj.threads = 1; // Only 1 thread
startWorkerScript(player, runningScriptObj, home);
if (!cbScript) return;
const home = player.getHomeComputer();
for (const script of home.scripts) {
if (script.filename === cbScript) {
const ramUsage = script.ramUsage;
const ramAvailable = home.maxRam - home.ramUsed;
if (ramUsage > ramAvailable) {
return; // Not enough RAM
}
const runningScriptObj = new RunningScript(script, []); // No args
runningScriptObj.threads = 1; // Only 1 thread
startWorkerScript(player, runningScriptObj, home);
}
}
};
return {
getOwnedAugmentations: function (purchased: any = false): any {
getOwnedAugmentations: function (_purchased: unknown = false): string[] {
const purchased = helper.boolean(_purchased);
helper.updateDynamicRam("getOwnedAugmentations", getRamCost(player, "getOwnedAugmentations"));
helper.checkSingularityAccess("getOwnedAugmentations");
const res = [];
@ -106,91 +112,63 @@ export function NetscriptSingularity(
}
return res;
},
getAugmentationsFromFaction: function (facname: any): any {
getAugmentationsFromFaction: function (_facName: unknown): string[] {
const facName = helper.string("getAugmentationsFromFaction", "facName", _facName);
helper.updateDynamicRam("getAugmentationsFromFaction", getRamCost(player, "getAugmentationsFromFaction"));
helper.checkSingularityAccess("getAugmentationsFromFaction");
const faction = getFaction("getAugmentationsFromFaction", facname);
const faction = getFaction("getAugmentationsFromFaction", facName);
// If player has a gang with this faction, return all augmentations.
if (player.hasGangWith(facname)) {
let augs = Object.values(Augmentations);
// Remove blacklisted augs.
const blacklist = [AugmentationNames.NeuroFluxGovernor, AugmentationNames.TheRedPill];
augs = augs.filter((a) => !blacklist.includes(a.name));
// Remove special augs.
augs = augs.filter((a) => !a.isSpecial);
// Remove faction-unique augs outside BN2. (But keep the one for this faction.)
if (player.bitNodeN !== 2) {
augs = augs.filter((a) => a.factions.length > 1 || Factions[facname].augmentations.includes(a.name));
}
return augs.map((a) => a.name);
}
return faction.augmentations.slice();
return getFactionAugmentationsFiltered(player, faction);
},
getAugmentationCost: function (name: any): any {
getAugmentationCost: function (_augName: unknown): [number, number] {
const augName = helper.string("getAugmentationCost", "augName", _augName);
helper.updateDynamicRam("getAugmentationCost", getRamCost(player, "getAugmentationCost"));
helper.checkSingularityAccess("getAugmentationCost");
const aug = getAugmentation("getAugmentationCost", name);
const aug = getAugmentation("getAugmentationCost", augName);
return [aug.baseRepRequirement, aug.baseCost];
},
getAugmentationPrereq: function (name: any): any {
getAugmentationPrereq: function (_augName: unknown): string[] {
const augName = helper.string("getAugmentationPrereq", "augName", _augName);
helper.updateDynamicRam("getAugmentationPrereq", getRamCost(player, "getAugmentationPrereq"));
helper.checkSingularityAccess("getAugmentationPrereq");
const aug = getAugmentation("getAugmentationPrereq", name);
const aug = getAugmentation("getAugmentationPrereq", augName);
return aug.prereqs.slice();
},
getAugmentationPrice: function (name: any): any {
getAugmentationPrice: function (_augName: unknown): number {
const augName = helper.string("getAugmentationPrice", "augName", _augName);
helper.updateDynamicRam("getAugmentationPrice", getRamCost(player, "getAugmentationPrice"));
helper.checkSingularityAccess("getAugmentationPrice");
const aug = getAugmentation("getAugmentationPrice", name);
const aug = getAugmentation("getAugmentationPrice", augName);
return aug.baseCost;
},
getAugmentationRepReq: function (name: any): any {
getAugmentationRepReq: function (_augName: unknown): number {
const augName = helper.string("getAugmentationRepReq", "augName", _augName);
helper.updateDynamicRam("getAugmentationRepReq", getRamCost(player, "getAugmentationRepReq"));
helper.checkSingularityAccess("getAugmentationRepReq");
const aug = getAugmentation("getAugmentationRepReq", name);
const aug = getAugmentation("getAugmentationRepReq", augName);
return aug.baseRepRequirement;
},
getAugmentationStats: function (name: any): any {
getAugmentationStats: function (_augName: unknown): AugmentationStats {
const augName = helper.string("getAugmentationStats", "augName", _augName);
helper.updateDynamicRam("getAugmentationStats", getRamCost(player, "getAugmentationStats"));
helper.checkSingularityAccess("getAugmentationStats");
const aug = getAugmentation("getAugmentationStats", name);
const aug = getAugmentation("getAugmentationStats", augName);
return Object.assign({}, aug.mults);
},
purchaseAugmentation: function (faction: any, name: any): any {
purchaseAugmentation: function (_facName: unknown, _augName: unknown): boolean {
const facName = helper.string("purchaseAugmentation", "facName", _facName);
const augName = helper.string("purchaseAugmentation", "augName", _augName);
helper.updateDynamicRam("purchaseAugmentation", getRamCost(player, "purchaseAugmentation"));
helper.checkSingularityAccess("purchaseAugmentation");
const fac = getFaction("purchaseAugmentation", faction);
const aug = getAugmentation("purchaseAugmentation", name);
const fac = getFaction("purchaseAugmentation", facName);
const aug = getAugmentation("purchaseAugmentation", augName);
let augs = [];
if (player.hasGangWith(faction)) {
for (const augName of Object.keys(Augmentations)) {
const aug = Augmentations[augName];
if (
augName === AugmentationNames.NeuroFluxGovernor ||
(augName === AugmentationNames.TheRedPill && player.bitNodeN !== 2) ||
// Special augs (i.e. Bladeburner augs)
aug.isSpecial ||
// Exclusive augs (i.e. QLink)
(aug.factions.length <= 1 && !fac.augmentations.includes(augName) && player.bitNodeN !== 2)
)
continue;
augs.push(augName);
}
} else {
augs = fac.augmentations;
}
const augs = getFactionAugmentationsFiltered(player, fac);
if (!augs.includes(name)) {
if (!augs.includes(augName)) {
workerScript.log(
"purchaseAugmentation",
() => `Faction '${faction}' does not have the '${name}' augmentation.`,
() => `Faction '${facName}' does not have the '${augName}' augmentation.`,
);
return false;
}
@ -199,13 +177,13 @@ export function NetscriptSingularity(
if (!isNeuroflux) {
for (let j = 0; j < player.queuedAugmentations.length; ++j) {
if (player.queuedAugmentations[j].name === aug.name) {
workerScript.log("purchaseAugmentation", () => `You already have the '${name}' augmentation.`);
workerScript.log("purchaseAugmentation", () => `You already have the '${augName}' augmentation.`);
return false;
}
}
for (let j = 0; j < player.augmentations.length; ++j) {
if (player.augmentations[j].name === aug.name) {
workerScript.log("purchaseAugmentation", () => `You already have the '${name}' augmentation.`);
workerScript.log("purchaseAugmentation", () => `You already have the '${augName}' augmentation.`);
return false;
}
}
@ -225,7 +203,8 @@ export function NetscriptSingularity(
return false;
}
},
softReset: function (cbScript: any): any {
softReset: function (_cbScript: unknown): void {
const cbScript = helper.string("softReset", "cbScript", _cbScript);
helper.updateDynamicRam("softReset", getRamCost(player, "softReset"));
helper.checkSingularityAccess("softReset");
@ -239,7 +218,8 @@ export function NetscriptSingularity(
workerScript.running = false;
killWorkerScript(workerScript);
},
installAugmentations: function (cbScript: any): any {
installAugmentations: function (_cbScript: unknown): boolean {
const cbScript = helper.string("installAugmentations", "cbScript", _cbScript);
helper.updateDynamicRam("installAugmentations", getRamCost(player, "installAugmentations"));
helper.checkSingularityAccess("installAugmentations");
@ -259,9 +239,11 @@ export function NetscriptSingularity(
workerScript.running = false; // Prevent workerScript from "finishing execution naturally"
killWorkerScript(workerScript);
return true;
},
goToLocation: function (locationName: any): boolean {
goToLocation: function (_locationName: unknown): boolean {
const locationName = helper.string("goToLocation", "locationName", _locationName);
helper.updateDynamicRam("goToLocation", getRamCost(player, "goToLocation"));
helper.checkSingularityAccess("goToLocation");
const location = Object.values(Locations).find((l) => l.name === locationName);
@ -277,7 +259,10 @@ export function NetscriptSingularity(
player.gainIntelligenceExp(CONSTANTS.IntelligenceSingFnBaseExpGain / 50000);
return true;
},
universityCourse: function (universityName: any, className: any, focus = true): any {
universityCourse: function (_universityName: unknown, _className: unknown, _focus: unknown = true): boolean {
const universityName = helper.string("universityCourse", "universityName", _universityName);
const className = helper.string("universityCourse", "className", _className);
const focus = helper.boolean(_focus);
helper.updateDynamicRam("universityCourse", getRamCost(player, "universityCourse"));
helper.checkSingularityAccess("universityCourse");
const wasFocusing = player.focus;
@ -365,7 +350,10 @@ export function NetscriptSingularity(
return true;
},
gymWorkout: function (gymName: any, stat: any, focus = true): any {
gymWorkout: function (_gymName: unknown, _stat: unknown, _focus: unknown = true): boolean {
const gymName = helper.string("gymWorkout", "gymName", _gymName);
const stat = helper.string("gymWorkout", "stat", _stat);
const focus = helper.boolean(_focus);
helper.updateDynamicRam("gymWorkout", getRamCost(player, "gymWorkout"));
helper.checkSingularityAccess("gymWorkout");
const wasFocusing = player.focus;
@ -477,11 +465,12 @@ export function NetscriptSingularity(
return true;
},
travelToCity: function (cityname: any): any {
travelToCity: function (_cityName: unknown): boolean {
const cityName = helper.city("travelToCity", "cityName", _cityName);
helper.updateDynamicRam("travelToCity", getRamCost(player, "travelToCity"));
helper.checkSingularityAccess("travelToCity");
switch (cityname) {
switch (cityName) {
case CityName.Aevum:
case CityName.Chongqing:
case CityName.Sector12:
@ -493,16 +482,16 @@ export function NetscriptSingularity(
return false;
}
player.loseMoney(CONSTANTS.TravelCost, "other");
player.city = cityname;
workerScript.log("travelToCity", () => `Traveled to ${cityname}`);
player.city = cityName;
workerScript.log("travelToCity", () => `Traveled to ${cityName}`);
player.gainIntelligenceExp(CONSTANTS.IntelligenceSingFnBaseExpGain / 50000);
return true;
default:
throw helper.makeRuntimeErrorMsg("travelToCity", `Invalid city name: '${cityname}'.`);
throw helper.makeRuntimeErrorMsg("travelToCity", `Invalid city name: '${cityName}'.`);
}
},
purchaseTor: function (): any {
purchaseTor: function (): boolean {
helper.updateDynamicRam("purchaseTor", getRamCost(player, "purchaseTor"));
helper.checkSingularityAccess("purchaseTor");
@ -534,7 +523,8 @@ export function NetscriptSingularity(
workerScript.log("purchaseTor", () => "You have purchased a Tor router!");
return true;
},
purchaseProgram: function (programName: any): any {
purchaseProgram: function (_programName: unknown): boolean {
const programName = helper.string("purchaseProgram", "programName", _programName).toLowerCase();
helper.updateDynamicRam("purchaseProgram", getRamCost(player, "purchaseProgram"));
helper.checkSingularityAccess("purchaseProgram");
@ -543,8 +533,6 @@ export function NetscriptSingularity(
return false;
}
programName = programName.toLowerCase();
const item = Object.values(DarkWebItems).find((i) => i.program.toLowerCase() === programName);
if (item == null) {
workerScript.log("purchaseProgram", () => `Invalid program name: '${programName}.`);
@ -573,12 +561,13 @@ export function NetscriptSingularity(
player.gainIntelligenceExp(CONSTANTS.IntelligenceSingFnBaseExpGain / 5000);
return true;
},
getCurrentServer: function (): any {
getCurrentServer: function (): string {
helper.updateDynamicRam("getCurrentServer", getRamCost(player, "getCurrentServer"));
helper.checkSingularityAccess("getCurrentServer");
return player.getCurrentServer().hostname;
},
connect: function (hostname: any): any {
connect: function (_hostname: unknown): boolean {
const hostname = helper.string("purchaseProgram", "hostname", _hostname);
helper.updateDynamicRam("connect", getRamCost(player, "connect"));
helper.checkSingularityAccess("connect");
if (!hostname) {
@ -613,13 +602,13 @@ export function NetscriptSingularity(
return false;
},
manualHack: function (): any {
manualHack: function (): Promise<number> {
helper.updateDynamicRam("manualHack", getRamCost(player, "manualHack"));
helper.checkSingularityAccess("manualHack");
const server = player.getCurrentServer();
return helper.hack(server.hostname, true);
},
installBackdoor: function (): any {
installBackdoor: function (): Promise<void> {
helper.updateDynamicRam("installBackdoor", getRamCost(player, "installBackdoor"));
helper.checkSingularityAccess("installBackdoor");
const baseserver = player.getCurrentServer();
@ -657,8 +646,8 @@ export function NetscriptSingularity(
helper.checkSingularityAccess("isFocused");
return player.focus;
},
setFocus: function (afocus: any): boolean {
const focus = helper.boolean(afocus);
setFocus: function (_focus: unknown): boolean {
const focus = helper.boolean(_focus);
helper.updateDynamicRam("setFocus", getRamCost(player, "setFocus"));
helper.checkSingularityAccess("setFocus");
if (!player.isWorking) {
@ -686,7 +675,7 @@ export function NetscriptSingularity(
}
return false;
},
getStats: function (): any {
getStats: function (): PlayerSkills {
helper.updateDynamicRam("getStats", getRamCost(player, "getStats"));
helper.checkSingularityAccess("getStats");
workerScript.log("getStats", () => `getStats is deprecated, please use getplayer`);
@ -701,7 +690,7 @@ export function NetscriptSingularity(
intelligence: player.intelligence,
};
},
getCharacterInformation: function (): any {
getCharacterInformation: function (): CharacterInfo {
helper.updateDynamicRam("getCharacterInformation", getRamCost(player, "getCharacterInformation"));
helper.checkSingularityAccess("getCharacterInformation");
workerScript.log("getCharacterInformation", () => `getCharacterInformation is deprecated, please use getplayer`);
@ -717,6 +706,8 @@ export function NetscriptSingularity(
mult: {
agility: player.agility_mult,
agilityExp: player.agility_exp_mult,
charisma: player.charisma,
charismaExp: player.charisma_exp,
companyRep: player.company_rep_mult,
crimeMoney: player.crime_money_mult,
crimeSuccess: player.crime_success_mult,
@ -749,21 +740,21 @@ export function NetscriptSingularity(
charismaExp: player.charisma_exp,
};
},
hospitalize: function (): any {
hospitalize: function (): void {
helper.updateDynamicRam("hospitalize", getRamCost(player, "hospitalize"));
helper.checkSingularityAccess("hospitalize");
if (player.isWorking || Router.page() === Page.Infiltration || Router.page() === Page.BitVerse) {
workerScript.log("hospitalize", () => "Cannot go to the hospital because the player is busy.");
return;
}
return player.hospitalize();
player.hospitalize();
},
isBusy: function (): any {
isBusy: function (): boolean {
helper.updateDynamicRam("isBusy", getRamCost(player, "isBusy"));
helper.checkSingularityAccess("isBusy");
return player.isWorking || Router.page() === Page.Infiltration || Router.page() === Page.BitVerse;
},
stopAction: function (): any {
stopAction: function (): boolean {
helper.updateDynamicRam("stopAction", getRamCost(player, "stopAction"));
helper.checkSingularityAccess("stopAction");
if (player.isWorking) {
@ -777,7 +768,7 @@ export function NetscriptSingularity(
}
return false;
},
upgradeHomeCores: function (): any {
upgradeHomeCores: function (): boolean {
helper.updateDynamicRam("upgradeHomeCores", getRamCost(player, "upgradeHomeCores"));
helper.checkSingularityAccess("upgradeHomeCores");
@ -807,13 +798,13 @@ export function NetscriptSingularity(
);
return true;
},
getUpgradeHomeCoresCost: function (): any {
getUpgradeHomeCoresCost: function (): number {
helper.updateDynamicRam("getUpgradeHomeCoresCost", getRamCost(player, "getUpgradeHomeCoresCost"));
helper.checkSingularityAccess("getUpgradeHomeCoresCost");
return player.getUpgradeHomeCoresCost();
},
upgradeHomeRam: function (): any {
upgradeHomeRam: function (): boolean {
helper.updateDynamicRam("upgradeHomeRam", getRamCost(player, "upgradeHomeRam"));
helper.checkSingularityAccess("upgradeHomeRam");
@ -846,13 +837,15 @@ export function NetscriptSingularity(
);
return true;
},
getUpgradeHomeRamCost: function (): any {
getUpgradeHomeRamCost: function (): number {
helper.updateDynamicRam("getUpgradeHomeRamCost", getRamCost(player, "getUpgradeHomeRamCost"));
helper.checkSingularityAccess("getUpgradeHomeRamCost");
return player.getUpgradeHomeRamCost();
},
workForCompany: function (companyName: any, focus = true): any {
workForCompany: function (_companyName: unknown, _focus: unknown = true): boolean {
let companyName = helper.string("workForCompany", "companyName", _companyName);
const focus = helper.boolean(_focus);
helper.updateDynamicRam("workForCompany", getRamCost(player, "workForCompany"));
helper.checkSingularityAccess("workForCompany");
@ -906,12 +899,14 @@ export function NetscriptSingularity(
);
return true;
},
applyToCompany: function (companyName: any, field: any): any {
applyToCompany: function (_companyName: unknown, _field: unknown): boolean {
const companyName = helper.string("applyToCompany", "companyName", _companyName);
const field = helper.string("applyToCompany", "field", _field);
helper.updateDynamicRam("applyToCompany", getRamCost(player, "applyToCompany"));
helper.checkSingularityAccess("applyToCompany");
getCompany("applyToCompany", companyName);
player.location = companyName;
player.location = companyName as LocationName;
let res;
switch (field.toLowerCase()) {
case "software":
@ -976,66 +971,73 @@ export function NetscriptSingularity(
}
return res;
},
getCompanyRep: function (companyName: any): any {
getCompanyRep: function (_companyName: unknown): number {
const companyName = helper.string("getCompanyRep", "companyName", _companyName);
helper.updateDynamicRam("getCompanyRep", getRamCost(player, "getCompanyRep"));
helper.checkSingularityAccess("getCompanyRep");
const company = getCompany("getCompanyRep", companyName);
return company.playerReputation;
},
getCompanyFavor: function (companyName: any): any {
getCompanyFavor: function (_companyName: unknown): number {
const companyName = helper.string("getCompanyFavor", "companyName", _companyName);
helper.updateDynamicRam("getCompanyFavor", getRamCost(player, "getCompanyFavor"));
helper.checkSingularityAccess("getCompanyFavor");
const company = getCompany("getCompanyFavor", companyName);
return company.favor;
},
getCompanyFavorGain: function (companyName: any): any {
getCompanyFavorGain: function (_companyName: unknown): number {
const companyName = helper.string("getCompanyFavorGain", "companyName", _companyName);
helper.updateDynamicRam("getCompanyFavorGain", getRamCost(player, "getCompanyFavorGain"));
helper.checkSingularityAccess("getCompanyFavorGain");
const company = getCompany("getCompanyFavorGain", companyName);
return company.getFavorGain();
},
checkFactionInvitations: function (): any {
checkFactionInvitations: function (): string[] {
helper.updateDynamicRam("checkFactionInvitations", getRamCost(player, "checkFactionInvitations"));
helper.checkSingularityAccess("checkFactionInvitations");
// Make a copy of player.factionInvitations
return player.factionInvitations.slice();
},
joinFaction: function (name: any): any {
joinFaction: function (_facName: unknown): boolean {
const facName = helper.string("joinFaction", "facName", _facName);
helper.updateDynamicRam("joinFaction", getRamCost(player, "joinFaction"));
helper.checkSingularityAccess("joinFaction");
getFaction("joinFaction", name);
getFaction("joinFaction", facName);
if (!player.factionInvitations.includes(name)) {
workerScript.log("joinFaction", () => `You have not been invited by faction '${name}'`);
if (!player.factionInvitations.includes(facName)) {
workerScript.log("joinFaction", () => `You have not been invited by faction '${facName}'`);
return false;
}
const fac = Factions[name];
const fac = Factions[facName];
joinFaction(fac);
// Update Faction Invitation list to account for joined + banned factions
for (let i = 0; i < player.factionInvitations.length; ++i) {
if (player.factionInvitations[i] == name || Factions[player.factionInvitations[i]].isBanned) {
if (player.factionInvitations[i] == facName || Factions[player.factionInvitations[i]].isBanned) {
player.factionInvitations.splice(i, 1);
i--;
}
}
player.gainIntelligenceExp(CONSTANTS.IntelligenceSingFnBaseExpGain * 5);
workerScript.log("joinFaction", () => `Joined the '${name}' faction.`);
workerScript.log("joinFaction", () => `Joined the '${facName}' faction.`);
return true;
},
workForFaction: function (name: any, type: any, focus = true): any {
workForFaction: function (_facName: unknown, _type: unknown, _focus: unknown = true): boolean {
const facName = helper.string("workForFaction", "facName", _facName);
const type = helper.string("workForFaction", "type", _type);
const focus = helper.boolean(_focus);
helper.updateDynamicRam("workForFaction", getRamCost(player, "workForFaction"));
helper.checkSingularityAccess("workForFaction");
getFaction("workForFaction", name);
getFaction("workForFaction", facName);
// if the player is in a gang and the target faction is any of the gang faction, fail
if (player.inGang() && AllGangs[name] !== undefined) {
workerScript.log("workForFaction", () => `Faction '${name}' does not offer work at the moment.`);
if (player.inGang() && AllGangs[facName] !== undefined) {
workerScript.log("workForFaction", () => `Faction '${facName}' does not offer work at the moment.`);
return false;
}
if (!player.factions.includes(name)) {
workerScript.log("workForFaction", () => `You are not a member of '${name}'`);
if (!player.factions.includes(facName)) {
workerScript.log("workForFaction", () => `You are not a member of '${facName}'`);
return false;
}
@ -1045,7 +1047,7 @@ export function NetscriptSingularity(
workerScript.log("workForFaction", () => txt);
}
const fac = Factions[name];
const fac = Factions[facName];
// Arrays listing factions that allow each time of work
switch (type.toLowerCase()) {
@ -1105,34 +1107,42 @@ export function NetscriptSingularity(
}
return true;
},
getFactionRep: function (name: any): any {
getFactionRep: function (_facName: unknown): number {
const facName = helper.string("getFactionRep", "facName", _facName);
helper.updateDynamicRam("getFactionRep", getRamCost(player, "getFactionRep"));
helper.checkSingularityAccess("getFactionRep");
const faction = getFaction("getFactionRep", name);
const faction = getFaction("getFactionRep", facName);
return faction.playerReputation;
},
getFactionFavor: function (name: any): any {
getFactionFavor: function (_facName: unknown): number {
const facName = helper.string("getFactionRep", "facName", _facName);
helper.updateDynamicRam("getFactionFavor", getRamCost(player, "getFactionFavor"));
helper.checkSingularityAccess("getFactionFavor");
const faction = getFaction("getFactionFavor", name);
const faction = getFaction("getFactionFavor", facName);
return faction.favor;
},
getFactionFavorGain: function (name: any): any {
getFactionFavorGain: function (_facName: unknown): number {
const facName = helper.string("getFactionFavorGain", "facName", _facName);
helper.updateDynamicRam("getFactionFavorGain", getRamCost(player, "getFactionFavorGain"));
helper.checkSingularityAccess("getFactionFavorGain");
const faction = getFaction("getFactionFavorGain", name);
const faction = getFaction("getFactionFavorGain", facName);
return faction.getFavorGain();
},
donateToFaction: function (name: any, amt: any): any {
donateToFaction: function (_facName: unknown, _amt: unknown): boolean {
const facName = helper.string("donateToFaction", "facName", _facName);
const amt = helper.number("donateToFaction", "amt", _amt);
helper.updateDynamicRam("donateToFaction", getRamCost(player, "donateToFaction"));
helper.checkSingularityAccess("donateToFaction");
const faction = getFaction("donateToFaction", name);
const faction = getFaction("donateToFaction", facName);
if (!player.factions.includes(faction.name)) {
workerScript.log("donateToFaction", () => `You can't donate to '${name}' because you aren't a member`);
workerScript.log("donateToFaction", () => `You can't donate to '${facName}' because you aren't a member`);
return false;
}
if (player.inGang() && faction.name === player.getGangFaction().name) {
workerScript.log("donateToFaction", () => `You can't donate to '${name}' because youre managing a gang for it`);
workerScript.log(
"donateToFaction",
() => `You can't donate to '${facName}' because youre managing a gang for it`,
);
return false;
}
if (typeof amt !== "number" || amt <= 0 || isNaN(amt)) {
@ -1142,7 +1152,7 @@ export function NetscriptSingularity(
if (player.money < amt) {
workerScript.log(
"donateToFaction",
() => `You do not have enough money to donate ${numeralWrapper.formatMoney(amt)} to '${name}'`,
() => `You do not have enough money to donate ${numeralWrapper.formatMoney(amt)} to '${facName}'`,
);
return false;
}
@ -1161,13 +1171,15 @@ export function NetscriptSingularity(
workerScript.log(
"donateToFaction",
() =>
`${numeralWrapper.formatMoney(amt)} donated to '${name}' for ${numeralWrapper.formatReputation(
`${numeralWrapper.formatMoney(amt)} donated to '${facName}' for ${numeralWrapper.formatReputation(
repGain,
)} reputation`,
);
return true;
},
createProgram: function (name: any, focus = true): any {
createProgram: function (_programName: unknown, _focus: unknown = true): boolean {
const programName = helper.string("createProgram", "programName", _programName).toLowerCase();
const focus = helper.boolean(_focus);
helper.updateDynamicRam("createProgram", getRamCost(player, "createProgram"));
helper.checkSingularityAccess("createProgram");
@ -1177,12 +1189,10 @@ export function NetscriptSingularity(
workerScript.log("createProgram", () => txt);
}
name = name.toLowerCase();
const p = Object.values(Programs).find((p) => p.name.toLowerCase() === name);
const p = Object.values(Programs).find((p) => p.name.toLowerCase() === programName);
if (p == null) {
workerScript.log("createProgram", () => `The specified program does not exist: '${name}`);
workerScript.log("createProgram", () => `The specified program does not exist: '${programName}`);
return false;
}
@ -1213,10 +1223,11 @@ export function NetscriptSingularity(
player.stopFocusing();
Router.toTerminal();
}
workerScript.log("createProgram", () => `Began creating program: '${name}'`);
workerScript.log("createProgram", () => `Began creating program: '${programName}'`);
return true;
},
commitCrime: function (crimeRoughName: any): any {
commitCrime: function (_crimeRoughName: unknown): number {
const crimeRoughName = helper.string("commitCrime", "crimeRoughName", _crimeRoughName);
helper.updateDynamicRam("commitCrime", getRamCost(player, "commitCrime"));
helper.checkSingularityAccess("commitCrime");
@ -1236,7 +1247,8 @@ export function NetscriptSingularity(
workerScript.log("commitCrime", () => `Attempting to commit ${crime.name}...`);
return crime.commit(Router, player, 1, workerScript);
},
getCrimeChance: function (crimeRoughName: any): any {
getCrimeChance: function (_crimeRoughName: unknown): number {
const crimeRoughName = helper.string("getCrimeChance", "crimeRoughName", _crimeRoughName);
helper.updateDynamicRam("getCrimeChance", getRamCost(player, "getCrimeChance"));
helper.checkSingularityAccess("getCrimeChance");
@ -1247,7 +1259,8 @@ export function NetscriptSingularity(
return crime.successRate(player);
},
getCrimeStats: function (crimeRoughName: any): any {
getCrimeStats: function (_crimeRoughName: unknown): CrimeStats {
const crimeRoughName = helper.string("getCrimeStats", "crimeRoughName", _crimeRoughName);
helper.updateDynamicRam("getCrimeStats", getRamCost(player, "getCrimeStats"));
helper.checkSingularityAccess("getCrimeStats");
@ -1269,7 +1282,8 @@ export function NetscriptSingularity(
}
return Object.values(DarkWebItems).map((p) => p.program);
},
getDarkwebProgramCost: function (programName: any): any {
getDarkwebProgramCost: function (_programName: unknown): number {
const programName = helper.string("getDarkwebProgramCost", "programName", _programName).toLowerCase();
helper.updateDynamicRam("getDarkwebProgramCost", getRamCost(player, "getDarkwebProgramCost"));
helper.checkSingularityAccess("getDarkwebProgramCost");
@ -1281,7 +1295,6 @@ export function NetscriptSingularity(
return -1;
}
programName = programName.toLowerCase();
const item = Object.values(DarkWebItems).find((i) => i.program.toLowerCase() === programName);
// If the program doesn't exist, throw an error. The reasoning here is that the 99% case is that

@ -10,10 +10,16 @@ import { Augmentations } from "../Augmentation/Augmentations";
import { CityName } from "../Locations/data/CityNames";
import { findCrime } from "../Crime/CrimeHelpers";
import { Sleeve as ISleeve } from "../ScriptEditor/NetscriptDefinitions";
import {
AugmentPair,
Sleeve as ISleeve,
SleeveInformation,
SleeveSkills,
SleeveTask,
} from "../ScriptEditor/NetscriptDefinitions";
export function NetscriptSleeve(player: IPlayer, workerScript: WorkerScript, helper: INetscriptHelper): ISleeve {
const checkSleeveAPIAccess = function (func: any): void {
const checkSleeveAPIAccess = function (func: string): void {
if (player.bitNodeN !== 10 && !SourceFileFlags[10]) {
throw helper.makeRuntimeErrorMsg(
`sleeve.${func}`,
@ -22,7 +28,7 @@ export function NetscriptSleeve(player: IPlayer, workerScript: WorkerScript, hel
}
};
const checkSleeveNumber = function (func: any, sleeveNumber: any): void {
const checkSleeveNumber = function (func: string, sleeveNumber: number): void {
if (sleeveNumber >= player.sleeves.length || sleeveNumber < 0) {
const msg = `Invalid sleeve number: ${sleeveNumber}`;
workerScript.log(func, () => msg);
@ -30,7 +36,7 @@ export function NetscriptSleeve(player: IPlayer, workerScript: WorkerScript, hel
}
};
const getSleeveStats = function (sleeveNumber: any): any {
const getSleeveStats = function (sleeveNumber: number): SleeveSkills {
const sl = player.sleeves[sleeveNumber];
return {
shock: 100 - sl.shock,
@ -42,7 +48,7 @@ export function NetscriptSleeve(player: IPlayer, workerScript: WorkerScript, hel
agility: sl.agility,
charisma: sl.charisma,
};
}
};
return {
getNumSleeves: function (): number {
@ -50,23 +56,23 @@ export function NetscriptSleeve(player: IPlayer, workerScript: WorkerScript, hel
checkSleeveAPIAccess("getNumSleeves");
return player.sleeves.length;
},
setToShockRecovery: function (asleeveNumber: any = 0): boolean {
const sleeveNumber = helper.number("setToShockRecovery", "sleeveNumber", asleeveNumber);
setToShockRecovery: function (_sleeveNumber: unknown): boolean {
const sleeveNumber = helper.number("setToShockRecovery", "sleeveNumber", _sleeveNumber);
helper.updateDynamicRam("setToShockRecovery", getRamCost(player, "sleeve", "setToShockRecovery"));
checkSleeveAPIAccess("setToShockRecovery");
checkSleeveNumber("setToShockRecovery", sleeveNumber);
return player.sleeves[sleeveNumber].shockRecovery(player);
},
setToSynchronize: function (asleeveNumber: any = 0): boolean {
const sleeveNumber = helper.number("setToSynchronize", "sleeveNumber", asleeveNumber);
setToSynchronize: function (_sleeveNumber: unknown): boolean {
const sleeveNumber = helper.number("setToSynchronize", "sleeveNumber", _sleeveNumber);
helper.updateDynamicRam("setToSynchronize", getRamCost(player, "sleeve", "setToSynchronize"));
checkSleeveAPIAccess("setToSynchronize");
checkSleeveNumber("setToSynchronize", sleeveNumber);
return player.sleeves[sleeveNumber].synchronize(player);
},
setToCommitCrime: function (asleeveNumber: any = 0, aCrimeRoughName: any = ""): boolean {
const sleeveNumber = helper.number("setToCommitCrime", "sleeveNumber", asleeveNumber);
const crimeRoughName = helper.string("setToCommitCrime", "crimeName", aCrimeRoughName);
setToCommitCrime: function (_sleeveNumber: unknown, _crimeRoughName: unknown): boolean {
const sleeveNumber = helper.number("setToCommitCrime", "sleeveNumber", _sleeveNumber);
const crimeRoughName = helper.string("setToCommitCrime", "crimeName", _crimeRoughName);
helper.updateDynamicRam("setToCommitCrime", getRamCost(player, "sleeve", "setToCommitCrime"));
checkSleeveAPIAccess("setToCommitCrime");
checkSleeveNumber("setToCommitCrime", sleeveNumber);
@ -76,25 +82,25 @@ export function NetscriptSleeve(player: IPlayer, workerScript: WorkerScript, hel
}
return player.sleeves[sleeveNumber].commitCrime(player, crime.name);
},
setToUniversityCourse: function (asleeveNumber: any = 0, auniversityName: any = "", aclassName: any = ""): boolean {
const sleeveNumber = helper.number("setToUniversityCourse", "sleeveNumber", asleeveNumber);
const universityName = helper.string("setToUniversityCourse", "universityName", auniversityName);
const className = helper.string("setToUniversityCourse", "className", aclassName);
setToUniversityCourse: function (_sleeveNumber: unknown, _universityName: unknown, _className: unknown): boolean {
const sleeveNumber = helper.number("setToUniversityCourse", "sleeveNumber", _sleeveNumber);
const universityName = helper.string("setToUniversityCourse", "universityName", _universityName);
const className = helper.string("setToUniversityCourse", "className", _className);
helper.updateDynamicRam("setToUniversityCourse", getRamCost(player, "sleeve", "setToUniversityCourse"));
checkSleeveAPIAccess("setToUniversityCourse");
checkSleeveNumber("setToUniversityCourse", sleeveNumber);
return player.sleeves[sleeveNumber].takeUniversityCourse(player, universityName, className);
},
travel: function (asleeveNumber: any = 0, acityName: any = ""): boolean {
const sleeveNumber = helper.number("travel", "sleeveNumber", asleeveNumber);
const cityName = helper.string("setToUniversityCourse", "cityName", acityName);
travel: function (_sleeveNumber: unknown, _cityName: unknown): boolean {
const sleeveNumber = helper.number("travel", "sleeveNumber", _sleeveNumber);
const cityName = helper.string("setToUniversityCourse", "cityName", _cityName);
helper.updateDynamicRam("travel", getRamCost(player, "sleeve", "travel"));
checkSleeveAPIAccess("travel");
checkSleeveNumber("travel", sleeveNumber);
return player.sleeves[sleeveNumber].travel(player, cityName as CityName);
},
setToCompanyWork: function (asleeveNumber: any = 0, acompanyName: any = ""): boolean {
const sleeveNumber = helper.number("setToCompanyWork", "sleeveNumber", asleeveNumber);
setToCompanyWork: function (_sleeveNumber: unknown, acompanyName: unknown): boolean {
const sleeveNumber = helper.number("setToCompanyWork", "sleeveNumber", _sleeveNumber);
const companyName = helper.string("setToUniversityCourse", "companyName", acompanyName);
helper.updateDynamicRam("setToCompanyWork", getRamCost(player, "sleeve", "setToCompanyWork"));
checkSleeveAPIAccess("setToCompanyWork");
@ -116,10 +122,10 @@ export function NetscriptSleeve(player: IPlayer, workerScript: WorkerScript, hel
return player.sleeves[sleeveNumber].workForCompany(player, companyName);
},
setToFactionWork: function (asleeveNumber: any = 0, afactionName: any = "", aworkType: any = ""): boolean {
const sleeveNumber = helper.number("setToFactionWork", "sleeveNumber", asleeveNumber);
const factionName = helper.string("setToUniversityCourse", "factionName", afactionName);
const workType = helper.string("setToUniversityCourse", "workType", aworkType);
setToFactionWork: function (_sleeveNumber: unknown, _factionName: unknown, _workType: unknown): boolean {
const sleeveNumber = helper.number("setToFactionWork", "sleeveNumber", _sleeveNumber);
const factionName = helper.string("setToUniversityCourse", "factionName", _factionName);
const workType = helper.string("setToUniversityCourse", "workType", _workType);
helper.updateDynamicRam("setToFactionWork", getRamCost(player, "sleeve", "setToFactionWork"));
checkSleeveAPIAccess("setToFactionWork");
checkSleeveNumber("setToFactionWork", sleeveNumber);
@ -140,40 +146,25 @@ export function NetscriptSleeve(player: IPlayer, workerScript: WorkerScript, hel
return player.sleeves[sleeveNumber].workForFaction(player, factionName, workType);
},
setToGymWorkout: function (asleeveNumber: any = 0, agymName: any = "", astat: any = ""): boolean {
const sleeveNumber = helper.number("setToGymWorkout", "sleeveNumber", asleeveNumber);
const gymName = helper.string("setToUniversityCourse", "gymName", agymName);
const stat = helper.string("setToUniversityCourse", "stat", astat);
setToGymWorkout: function (_sleeveNumber: unknown, _gymName: unknown, _stat: unknown): boolean {
const sleeveNumber = helper.number("setToGymWorkout", "sleeveNumber", _sleeveNumber);
const gymName = helper.string("setToUniversityCourse", "gymName", _gymName);
const stat = helper.string("setToUniversityCourse", "stat", _stat);
helper.updateDynamicRam("setToGymWorkout", getRamCost(player, "sleeve", "setToGymWorkout"));
checkSleeveAPIAccess("setToGymWorkout");
checkSleeveNumber("setToGymWorkout", sleeveNumber);
return player.sleeves[sleeveNumber].workoutAtGym(player, gymName, stat);
},
getSleeveStats: function (asleeveNumber: any = 0): {
shock: number;
sync: number;
hacking: number;
strength: number;
defense: number;
dexterity: number;
agility: number;
charisma: number;
} {
const sleeveNumber = helper.number("getSleeveStats", "sleeveNumber", asleeveNumber);
getSleeveStats: function (_sleeveNumber: unknown): SleeveSkills {
const sleeveNumber = helper.number("getSleeveStats", "sleeveNumber", _sleeveNumber);
helper.updateDynamicRam("getSleeveStats", getRamCost(player, "sleeve", "getSleeveStats"));
checkSleeveAPIAccess("getSleeveStats");
checkSleeveNumber("getSleeveStats", sleeveNumber);
return getSleeveStats(sleeveNumber)
return getSleeveStats(sleeveNumber);
},
getTask: function (asleeveNumber: any = 0): {
task: string;
crime: string;
location: string;
gymStatType: string;
factionWorkType: string;
} {
const sleeveNumber = helper.number("getTask", "sleeveNumber", asleeveNumber);
getTask: function (_sleeveNumber: unknown): SleeveTask {
const sleeveNumber = helper.number("getTask", "sleeveNumber", _sleeveNumber);
helper.updateDynamicRam("getTask", getRamCost(player, "sleeve", "getTask"));
checkSleeveAPIAccess("getTask");
checkSleeveNumber("getTask", sleeveNumber);
@ -187,14 +178,15 @@ export function NetscriptSleeve(player: IPlayer, workerScript: WorkerScript, hel
factionWorkType: FactionWorkType[sl.factionWorkType],
};
},
getInformation: function (asleeveNumber: any = 0): any {
const sleeveNumber = helper.number("getInformation", "sleeveNumber", asleeveNumber);
getInformation: function (_sleeveNumber: unknown): SleeveInformation {
const sleeveNumber = helper.number("getInformation", "sleeveNumber", _sleeveNumber);
helper.updateDynamicRam("getInformation", getRamCost(player, "sleeve", "getInformation"));
checkSleeveAPIAccess("getInformation");
checkSleeveNumber("getInformation", sleeveNumber);
const sl = player.sleeves[sleeveNumber];
return {
tor: false,
city: sl.city,
hp: sl.hp,
jobs: Object.keys(player.jobs), // technically sleeves have the same jobs as the player.
@ -252,8 +244,8 @@ export function NetscriptSleeve(player: IPlayer, workerScript: WorkerScript, hel
workRepGain: sl.getRepGain(player),
};
},
getSleeveAugmentations: function (asleeveNumber: any = 0): string[] {
const sleeveNumber = helper.number("getSleeveAugmentations", "sleeveNumber", asleeveNumber);
getSleeveAugmentations: function (_sleeveNumber: unknown): string[] {
const sleeveNumber = helper.number("getSleeveAugmentations", "sleeveNumber", _sleeveNumber);
helper.updateDynamicRam("getSleeveAugmentations", getRamCost(player, "sleeve", "getSleeveAugmentations"));
checkSleeveAPIAccess("getSleeveAugmentations");
checkSleeveNumber("getSleeveAugmentations", sleeveNumber);
@ -264,11 +256,8 @@ export function NetscriptSleeve(player: IPlayer, workerScript: WorkerScript, hel
}
return augs;
},
getSleevePurchasableAugs: function (asleeveNumber: any = 0): {
name: string;
cost: number;
}[] {
const sleeveNumber = helper.number("getSleevePurchasableAugs", "sleeveNumber", asleeveNumber);
getSleevePurchasableAugs: function (_sleeveNumber: unknown): AugmentPair[] {
const sleeveNumber = helper.number("getSleevePurchasableAugs", "sleeveNumber", _sleeveNumber);
helper.updateDynamicRam("getSleevePurchasableAugs", getRamCost(player, "sleeve", "getSleevePurchasableAugs"));
checkSleeveAPIAccess("getSleevePurchasableAugs");
checkSleeveNumber("getSleevePurchasableAugs", sleeveNumber);
@ -285,9 +274,9 @@ export function NetscriptSleeve(player: IPlayer, workerScript: WorkerScript, hel
return augs;
},
purchaseSleeveAug: function (asleeveNumber: any = 0, aaugName: any = ""): boolean {
const sleeveNumber = helper.number("purchaseSleeveAug", "sleeveNumber", asleeveNumber);
const augName = helper.string("purchaseSleeveAug", "augName", aaugName);
purchaseSleeveAug: function (_sleeveNumber: unknown, _augName: unknown): boolean {
const sleeveNumber = helper.number("purchaseSleeveAug", "sleeveNumber", _sleeveNumber);
const augName = helper.string("purchaseSleeveAug", "augName", _augName);
helper.updateDynamicRam("purchaseSleeveAug", getRamCost(player, "sleeve", "purchaseSleeveAug"));
checkSleeveAPIAccess("purchaseSleeveAug");
checkSleeveNumber("purchaseSleeveAug", sleeveNumber);

@ -26,6 +26,6 @@ export class GraftableAugmentation {
const antiLog = Math.max(sum(Object.values(this.augmentation.mults)), 1);
const mult = Math.log2(antiLog);
return CONSTANTS.AugmentationGraftingTimeBase * mult + CONSTANTS.MillisecondsPerHalfHour;
return (CONSTANTS.AugmentationGraftingTimeBase * mult + CONSTANTS.MillisecondsPerHalfHour) / 2;
}
}

@ -92,79 +92,83 @@ export const GraftingRoot = (): React.ReactElement => {
<Box sx={{ my: 3 }}>
<Typography variant="h5">Graft Augmentations</Typography>
<Paper sx={{ my: 1, width: "fit-content", display: "grid", gridTemplateColumns: "1fr 3fr" }}>
<List sx={{ maxHeight: 400, overflowY: "scroll", borderRight: `1px solid ${Settings.theme.welllight}` }}>
{getAvailableAugs(player).map((k, i) => (
<ListItemButton key={i + 1} onClick={() => setSelectedAug(k)} selected={selectedAug === k}>
<Typography>{k}</Typography>
</ListItemButton>
))}
</List>
<Box sx={{ m: 1 }}>
<Typography variant="h6" sx={{ display: "flex", alignItems: "center", flexWrap: "wrap" }}>
<Construction sx={{ mr: 1 }} /> {selectedAug}
</Typography>
<Button
onClick={() => setGraftOpen(true)}
sx={{ width: "100%" }}
disabled={!canGraft(player, GraftableAugmentations[selectedAug])}
>
Graft Augmentation (
<Typography>
<Money money={GraftableAugmentations[selectedAug].cost} player={player} />
{getAvailableAugs(player).length > 0 ? (
<Paper sx={{ my: 1, width: "fit-content", display: "grid", gridTemplateColumns: "1fr 3fr" }}>
<List sx={{ maxHeight: 400, overflowY: "scroll", borderRight: `1px solid ${Settings.theme.welllight}` }}>
{getAvailableAugs(player).map((k, i) => (
<ListItemButton key={i + 1} onClick={() => setSelectedAug(k)} selected={selectedAug === k}>
<Typography>{k}</Typography>
</ListItemButton>
))}
</List>
<Box sx={{ m: 1 }}>
<Typography variant="h6" sx={{ display: "flex", alignItems: "center", flexWrap: "wrap" }}>
<Construction sx={{ mr: 1 }} /> {selectedAug}
</Typography>
)
</Button>
<ConfirmationModal
open={graftOpen}
onClose={() => setGraftOpen(false)}
onConfirm={() => {
const graftableAug = GraftableAugmentations[selectedAug];
player.loseMoney(graftableAug.cost, "augmentations");
player.startGraftAugmentationWork(selectedAug, graftableAug.time);
player.startFocusing();
router.toWork();
}}
confirmationText={
<>
Cancelling grafting will <b>not</b> save grafting progress, and the money you spend will <b>not</b> be
returned.
<br />
<br />
Additionally, grafting an Augmentation will increase the potency of the Entropy virus.
</>
}
/>
<Typography color={Settings.theme.info}>
<b>Time to Graft:</b>{" "}
{convertTimeMsToTimeElapsedString(
GraftableAugmentations[selectedAug].time / (1 + (player.getIntelligenceBonus(3) - 1) / 3),
)}
{/* Use formula so the displayed creation time is accurate to player bonus */}
</Typography>
{Augmentations[selectedAug].prereqs.length > 0 && (
<AugPreReqsChecklist player={player} aug={Augmentations[selectedAug]} />
)}
<br />
<Typography sx={{ maxHeight: 305, overflowY: "scroll" }}>
{(() => {
const aug = Augmentations[selectedAug];
const info = typeof aug.info === "string" ? <span>{aug.info}</span> : aug.info;
const tooltip = (
<Button
onClick={() => setGraftOpen(true)}
sx={{ width: "100%" }}
disabled={!canGraft(player, GraftableAugmentations[selectedAug])}
>
Graft Augmentation (
<Typography>
<Money money={GraftableAugmentations[selectedAug].cost} player={player} />
</Typography>
)
</Button>
<ConfirmationModal
open={graftOpen}
onClose={() => setGraftOpen(false)}
onConfirm={() => {
const graftableAug = GraftableAugmentations[selectedAug];
player.loseMoney(graftableAug.cost, "augmentations");
player.startGraftAugmentationWork(selectedAug, graftableAug.time);
player.startFocusing();
router.toWork();
}}
confirmationText={
<>
{info}
Cancelling grafting will <b>not</b> save grafting progress, and the money you spend will <b>not</b>{" "}
be returned.
<br />
<br />
{aug.stats}
Additionally, grafting an Augmentation will increase the potency of the Entropy virus.
</>
);
return tooltip;
})()}
</Typography>
</Box>
</Paper>
}
/>
<Typography color={Settings.theme.info}>
<b>Time to Graft:</b>{" "}
{convertTimeMsToTimeElapsedString(
GraftableAugmentations[selectedAug].time / (1 + (player.getIntelligenceBonus(3) - 1) / 3),
)}
{/* Use formula so the displayed creation time is accurate to player bonus */}
</Typography>
{Augmentations[selectedAug].prereqs.length > 0 && (
<AugPreReqsChecklist player={player} aug={Augmentations[selectedAug]} />
)}
<br />
<Typography sx={{ maxHeight: 305, overflowY: "scroll" }}>
{(() => {
const aug = Augmentations[selectedAug];
const info = typeof aug.info === "string" ? <span>{aug.info}</span> : aug.info;
const tooltip = (
<>
{info}
<br />
<br />
{aug.stats}
</>
);
return tooltip;
})()}
</Typography>
</Box>
</Paper>
) : (
<Typography>All Augmentations owned</Typography>
)}
</Box>
<Box sx={{ my: 3 }}>

@ -2078,15 +2078,16 @@ export function reapplyAllAugmentations(this: IPlayer, resetMultipliers = true):
this.augmentations[i].name = "Hacknet Node NIC Architecture Neural-Upload";
}
const augName = this.augmentations[i].name;
const playerAug = this.augmentations[i];
const augName = playerAug.name;
const aug = Augmentations[augName];
if (aug == null) {
console.warn(`Invalid augmentation name in Player.reapplyAllAugmentations(). Aug ${augName} will be skipped`);
continue;
}
aug.owned = true;
if (aug.name == AugmentationNames.NeuroFluxGovernor) {
for (let j = 0; j < aug.level; ++j) {
if (augName == AugmentationNames.NeuroFluxGovernor) {
for (let j = 0; j < playerAug.level; ++j) {
applyAugmentation(this.augmentations[i], true);
}
continue;

@ -1,5 +1,5 @@
import { FactionNames } from './Faction/data/FactionNames';
import { CityName } from './Locations/data/CityNames';
import { FactionNames } from "./Faction/data/FactionNames";
import { CityName } from "./Locations/data/CityNames";
import { Augmentations } from "./Augmentation/Augmentations";
import { augmentationExists, initAugmentations } from "./Augmentation/AugmentationHelpers";
import { AugmentationNames } from "./Augmentation/data/AugmentationNames";
@ -263,7 +263,7 @@ export function prestigeSourceFile(flume: boolean): void {
homeComp.messages.push(LiteratureNames.CorporationManagementHandbook);
dialogBoxCreate(
"You received a copy of the Corporation Management Handbook on your home computer. " +
"Read it if you need help getting started with Corporations!",
"Read it if you need help getting started with Corporations!",
);
}

@ -584,7 +584,7 @@ export interface BitNodeMultipliers {
/** Influences the maximum allowed RAM for a purchased server */
PurchasedServerMaxRam: number;
/** Influences cost of any purchased server at or above 128GB */
PurchasedServerSoftCap: number;
PurchasedServerSoftcap: number;
/** Influences the minimum favor the player must have with a faction before they can donate to gain rep. */
RepToDonateToFaction: number;
/** Influences how much the money on a server can be reduced when a script performs a hack against it. */
@ -667,6 +667,10 @@ export interface CharacterMult {
agility: number;
/** Agility exp */
agilityExp: number;
/** Charisma stat */
charisma: number;
/** Charisma exp */
charismaExp: number;
/** Company reputation */
companyRep: number;
/** Money earned from crimes */
@ -707,10 +711,10 @@ export interface CharacterInfo {
factions: string[];
/** Current health points */
hp: number;
/** Array of all companies at which you have jobs */
company: string[];
/** Array of all jobs */
jobs: string[];
/** Array of job positions for all companies you are employed at. Same order as 'jobs' */
jobTitle: string[];
jobTitles: string[];
/** Maximum health points */
maxHp: number;
/** Boolean indicating whether or not you have a tor router */
@ -735,6 +739,18 @@ export interface CharacterInfo {
workRepGain: number;
/** Money earned so far from work, if applicable */
workMoneyGain: number;
/** total hacking exp */
hackingExp: number;
/** total strength exp */
strengthExp: number;
/** total defense exp */
defenseExp: number;
/** total dexterity exp */
dexterityExp: number;
/** total agility exp */
agilityExp: number;
/** total charisma exp */
charismaExp: number;
}
/**
@ -2199,11 +2215,8 @@ export interface Singularity {
* Hospitalize the player.
* @remarks
* RAM cost: 0.25 GB * 16/4/1
*
*
* @returns The cost of the hospitalization.
*/
hospitalize(): number;
hospitalize(): void;
/**
* Soft reset the game.
@ -4324,6 +4337,12 @@ export interface NS extends Singularity {
*/
readonly ui: UserInterface;
/**
* Namespace for singularity functions.
* RAM cost: 0 GB
*/
readonly singularity: Singularity;
/**
* Namespace for grafting functions.
* @remarks
@ -5630,7 +5649,7 @@ export interface NS extends Singularity {
* @param args - Arguments to identify the script
* @returns The info about the running script if found, and null otherwise.
*/
getRunningScript(filename?: FilenameOrPID, hostname?: string, ...args: (string | number)[]): RunningScript;
getRunningScript(filename?: FilenameOrPID, hostname?: string, ...args: (string | number)[]): RunningScript | null;
/**
* Get cost of purchasing a server.

@ -163,7 +163,7 @@ export class BaseServer {
return false;
}
removeContract(contract: CodingContract): void {
removeContract(contract: CodingContract | string): void {
if (contract instanceof CodingContract) {
this.contracts = this.contracts.filter((c) => {
return c.fn !== contract.fn;

@ -276,7 +276,7 @@ export function SidebarRoot(props: IProps): React.ReactElement {
function handleShortcuts(this: Document, event: KeyboardEvent): any {
if (Settings.DisableHotkeys) return;
if ((props.player.isWorking && props.player.focus) || redPillFlag) return;
if (event.key === "t" && event.altKey) {
if (event.key === KEY.T && event.altKey) {
event.preventDefault();
clickTerminal();
} else if (event.key === KEY.C && event.altKey) {
@ -522,7 +522,9 @@ export function SidebarRoot(props: IProps): React.ReactElement {
<ListItemIcon>
<Badge badgeContent={invitationsCount !== 0 ? invitationsCount : undefined} color="error">
<Tooltip title={!open ? "Factions" : ""}>
<ContactsIcon color={![Page.Factions, Page.Faction].includes(props.page) ? "secondary" : "primary"} />
<ContactsIcon
color={![Page.Factions, Page.Faction].includes(props.page) ? "secondary" : "primary"}
/>
</Tooltip>
</Badge>
</ListItemIcon>
@ -570,7 +572,9 @@ export function SidebarRoot(props: IProps): React.ReactElement {
>
<ListItemIcon>
<Tooltip title={!open ? "Hacknet" : ""}>
<AccountTreeIcon color={flashHacknet ? "error" : props.page !== Page.Hacknet ? "secondary" : "primary"} />
<AccountTreeIcon
color={flashHacknet ? "error" : props.page !== Page.Hacknet ? "secondary" : "primary"}
/>
</Tooltip>
</ListItemIcon>
<ListItemText>

@ -1,3 +1,4 @@
import { KEY } from "../utils/helpers/keyCodes";
import { substituteAliases } from "../Alias";
// Helper function that checks if an argument (which is a string) is a valid number
function isNumber(str: string): boolean {
@ -55,11 +56,11 @@ export function ParseCommand(command: string): (string | number | boolean)[] {
}
const c = command.charAt(i);
if (c === '"') {
if (c === KEY.DOUBLE_QUOTE) {
// Double quotes
if (!escaped && prevChar === " ") {
const endQuote = command.indexOf('"', i + 1);
if (endQuote !== -1 && (endQuote === command.length - 1 || command.charAt(endQuote + 1) === " ")) {
if (!escaped && prevChar === KEY.SPACE) {
const endQuote = command.indexOf(KEY.DOUBLE_QUOTE, i + 1);
if (endQuote !== -1 && (endQuote === command.length - 1 || command.charAt(endQuote + 1) === KEY.SPACE)) {
args.push(command.substr(i + 1, endQuote - i - 1));
if (endQuote === command.length - 1) {
start = i = endQuote + 1;
@ -69,15 +70,15 @@ export function ParseCommand(command: string): (string | number | boolean)[] {
continue;
}
} else if (inQuote === ``) {
inQuote = `"`;
} else if (inQuote === `"`) {
inQuote = ``;
}
} else if (c === "'") {
inQuote = KEY.DOUBLE_QUOTE;
} else if (inQuote === KEY.DOUBLE_QUOTE) {
inQuote = ``;
}
} else if (c === KEY.QUOTE) {
// Single quotes, same thing as above
if (!escaped && prevChar === " ") {
const endQuote = command.indexOf("'", i + 1);
if (endQuote !== -1 && (endQuote === command.length - 1 || command.charAt(endQuote + 1) === " ")) {
if (!escaped && prevChar === KEY.SPACE) {
const endQuote = command.indexOf(KEY.QUOTE, i + 1);
if (endQuote !== -1 && (endQuote === command.length - 1 || command.charAt(endQuote + 1) === KEY.SPACE)) {
args.push(command.substr(i + 1, endQuote - i - 1));
if (endQuote === command.length - 1) {
start = i = endQuote + 1;
@ -87,11 +88,11 @@ export function ParseCommand(command: string): (string | number | boolean)[] {
continue;
}
} else if (inQuote === ``) {
inQuote = `'`;
} else if (inQuote === `'`) {
inQuote = ``;
}
} else if (c === " " && inQuote === ``) {
inQuote = KEY.QUOTE;
} else if (inQuote === KEY.QUOTE) {
inQuote = ``;
}
} else if (c === KEY.SPACE && inQuote === ``) {
const arg = command.substr(start, i - start);
// If this is a number, convert it from a string to number

@ -20,7 +20,7 @@ function isNs2(filename: string): boolean {
return filename.endsWith(".ns") || filename.endsWith(".js");
}
const newNs2Template = `/** @param {NS} ns **/
const newNs2Template = `/** @param {NS} ns */
export async function main(ns) {
}`;

@ -97,7 +97,7 @@ export function TerminalInput({ terminal, router, player }: IProps): React.React
break;
case "deletewordbefore": // Delete rest of word before the cursor
for (let delStart = start - 1; delStart > -2; --delStart) {
if ((inputText.charAt(delStart) === " " || delStart === -1) && delStart !== start - 1) {
if ((inputText.charAt(delStart) === KEY.SPACE || delStart === -1) && delStart !== start - 1) {
saveValue(inputText.substr(0, delStart + 1) + inputText.substr(start), () => {
// Move cursor to correct location
// foo bar |baz bum --> foo |baz bum
@ -110,7 +110,7 @@ export function TerminalInput({ terminal, router, player }: IProps): React.React
break;
case "deletewordafter": // Delete rest of word after the cursor, including trailing space
for (let delStart = start + 1; delStart <= value.length + 1; ++delStart) {
if (inputText.charAt(delStart) === " " || delStart === value.length + 1) {
if (inputText.charAt(delStart) === KEY.SPACE || delStart === value.length + 1) {
saveValue(inputText.substr(0, start) + inputText.substr(delStart + 1), () => {
// Move cursor to correct location
// foo bar |baz bum --> foo bar |bum
@ -151,7 +151,7 @@ export function TerminalInput({ terminal, router, player }: IProps): React.React
break;
case "prevword":
for (let i = start - 2; i >= 0; --i) {
if (ref.value.charAt(i) === " ") {
if (ref.value.charAt(i) === KEY.SPACE) {
ref.setSelectionRange(i + 1, i + 1);
return;
}
@ -163,7 +163,7 @@ export function TerminalInput({ terminal, router, player }: IProps): React.React
break;
case "nextword":
for (let i = start + 1; i <= inputLength; ++i) {
if (ref.value.charAt(i) === " ") {
if (ref.value.charAt(i) === KEY.SPACE) {
ref.setSelectionRange(i, i);
return;
}
@ -262,7 +262,7 @@ export function TerminalInput({ terminal, router, player }: IProps): React.React
}
// Select previous command.
if (event.key === KEY.UPARROW || (Settings.EnableBashHotkeys && event.key === "p" && event.ctrlKey)) {
if (event.key === KEY.UP_ARROW || (Settings.EnableBashHotkeys && event.key === KEY.P && event.ctrlKey)) {
if (Settings.EnableBashHotkeys) {
event.preventDefault();
}
@ -290,7 +290,7 @@ export function TerminalInput({ terminal, router, player }: IProps): React.React
}
// Select next command
if (event.key === KEY.DOWNARROW || (Settings.EnableBashHotkeys && event.key === "m" && event.ctrlKey)) {
if (event.key === KEY.DOWN_ARROW || (Settings.EnableBashHotkeys && event.key === KEY.M && event.ctrlKey)) {
if (Settings.EnableBashHotkeys) {
event.preventDefault();
}

@ -119,7 +119,7 @@ export const logBoxBaseZIndex = 1500;
function LogWindow(props: IProps): React.ReactElement {
const draggableRef = useRef<HTMLDivElement>(null);
const rootRef = useRef<Draggable>(null)
const rootRef = useRef<Draggable>(null);
const [script, setScript] = useState(props.script);
const classes = useStyles();
const container = useRef<HTMLDivElement>(null);
@ -129,22 +129,22 @@ function LogWindow(props: IProps): React.ReactElement {
setRerender((old) => !old);
}
useEffect(
() =>
WorkerScriptStartStopEventEmitter.subscribe(() => {
setTimeout(() => {
const server = GetServer(script.server);
if (server === null) return;
const exisitingScript = findRunningScript(script.filename, script.args, server);
if (exisitingScript) {
exisitingScript.logs = script.logs.concat(exisitingScript.logs)
setScript(exisitingScript)
}
rerender();
}, 100)
}),
[],
);
// useEffect(
// () =>
// WorkerScriptStartStopEventEmitter.subscribe(() => {
// setTimeout(() => {
// const server = GetServer(script.server);
// if (server === null) return;
// const exisitingScript = findRunningScript(script.filename, script.args, server);
// if (exisitingScript) {
// exisitingScript.logs = script.logs.concat(exisitingScript.logs)
// setScript(exisitingScript)
// }
// rerender();
// }, 100)
// }),
// [],
// );
useEffect(() => {
updateLayer();
@ -224,11 +224,8 @@ function LogWindow(props: IProps): React.ReactElement {
const isOnScreen = (node: HTMLDivElement): boolean => {
const bounds = node.getBoundingClientRect();
return !(bounds.right < 0 ||
bounds.bottom < 0 ||
bounds.left > innerWidth ||
bounds.top > outerWidth);
}
return !(bounds.right < 0 || bounds.bottom < 0 || bounds.left > innerWidth || bounds.top > outerWidth);
};
const resetPosition = (): void => {
const node = rootRef?.current;
@ -237,14 +234,11 @@ function LogWindow(props: IProps): React.ReactElement {
state.x = 0;
state.y = 0;
node.setState(state);
}
};
const boundToBody = (e: any): void | false => {
if (e.clientX < 0 ||
e.clientY < 0 ||
e.clientX > innerWidth ||
e.clientY > innerHeight) return false;
}
if (e.clientX < 0 || e.clientY < 0 || e.clientX > innerWidth || e.clientY > innerHeight) return false;
};
return (
<Draggable handle=".drag" onDrag={boundToBody} ref={rootRef}>

@ -217,11 +217,19 @@ export function WorkInProgressRoot(): React.ReactElement {
if (player.workType == CONSTANTS.WorkTypeCompany) {
const comp = Companies[player.companyName];
let companyRep = 0;
if (comp == null || !(comp instanceof Company)) {
throw new Error(`Could not find Company: ${player.companyName}`);
return (
<>
<Typography variant="h4" color="primary">
You cannot work for {player.companyName || "(Company not found)"} at this time, please try again if you
think this should have worked
</Typography>
<Button onClick={() => router.toTerminal()}>Back to Terminal</Button>
</>
);
}
companyRep = comp.playerReputation;
const companyRep = comp.playerReputation;
function cancel(): void {
player.finishWork(true);

@ -8,10 +8,29 @@ export enum KEY {
ENTER = "Enter",
ESC = "Escape",
TAB = "Tab",
UPARROW = "ArrowUp",
DOWNARROW = "ArrowDown",
LEFTARROW = "ArrowLeft",
RIGHTARROW = "ArrowRight",
SPACE = " ",
BACKSPACE = "Backspace",
UP_ARROW = "ArrowUp",
DOWN_ARROW = "ArrowDown",
LEFT_ARROW = "ArrowLeft",
RIGHT_ARROW = "ArrowRight",
QUOTE = "'",
DOUBLE_QUOTE = '"',
OPEN_BRACKET = "[",
CLOSE_BRACKET = "]",
LESS_THAN = "<",
GREATER_THAN = ">",
OPEN_PARENTHESIS = "(",
CLOSE_PARENTHESIS = ")",
OPEN_BRACE = "{",
CLOSE_BRACE = "}",
PIPE = "|",
DOT = ".",
FORWARD_SLASH = "/",
HYPHEN = "-",
HASH = "#",
k0 = "0",
k1 = "1",

@ -8,7 +8,7 @@ jest.mock(`!!raw-loader!../NetscriptDefinitions.d.ts`, () => "", {
virtual: true,
});
const code = `/** @param {NS} ns **/
const code = `/** @param {NS} ns */
export async function main(ns) {
ns.print(ns.getWeakenTime('n00dles'));
}`;