Merge pull request #433 from danielyxie/bladeburner-rebalancing

Bladeburner rebalancing
This commit is contained in:
danielyxie 2018-08-11 20:25:35 -05:00 committed by GitHub
commit b15582ff71
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 159 additions and 81 deletions

File diff suppressed because one or more lines are too long

@ -235,18 +235,30 @@ getSkillLevel
.. js:function:: getSkillLevel(skillName="")
:param string skillName: Name of skill
:param string skillName: Name of skill. Case-sensitive and must be an exact match
This function returns your level in the specified skill.
The function returns -1 if an invalid skill name is passed in
getSkillUpgradeCost
-------------------
.. js:function:: getSkillUpgradeCost(skillName="")
:param string skillName: Name of skill. Case-sensitive and must be an exact match
This function returns the number of skill points needed to upgrade the
specified skill.
The function returns -1 if an invalid skill name is passed in.
upgradeSkill
------------
.. js:function:: upgradeSkill(skillName)
:param string skillName: Name of Skill to be upgraded. Must be an exact match
:param string skillName: Name of Skill to be upgraded. Case-sensitive and must be an exact match
Attempts to upgrade the specified Bladeburner skill. Returns true if the
skill is successfully upgraded, and false otherwise
@ -357,6 +369,21 @@ joinBladeburnerDivision
are already a member.
Returns false otherwise
getBonusTime
------------
.. js:function:: getBonusTime()
Returns the amount of accumulated "bonus time" (seconds) for the Bladeburner mechanic.
"Bonus time" is accumulated when the game is offline or if the game is
inactive in the browser.
"Bonus time" makes the game progress faster, up to 5x the normal speed.
For example, if an action takes 30 seconds to complete but you've accumulated
over 30 seconds in bonus time, then the action will only take 6 seconds
in real life to complete.
Examples
--------

@ -659,16 +659,14 @@ getNextHacknetNodeCost
.. js:function:: getNextHacknetNodeCost()
Returns the cost of purchasing a new Hacknet Node
Deprecated (no longer usable). See :doc:`netscripthacknetnodeapi`
purchaseHacknetNode
^^^^^^^^^^^^^^^^^^^
.. js:function:: purchaseHacknetNode()
Purchases a new Hacknet Node. Returns a number with the index of the Hacknet Node. This index is equivalent to the number at the
end of the Hacknet Node's name (e.g The Hacknet Node named 'hacknet-node-4' will have an index of 4). If the player cannot afford
to purchase a new Hacknet Node then the function will return false.
Deprecated (no longer usable). See :doc:`netscripthacknetnodeapi`
getPurchasedServerCost
^^^^^^^^^^^^^^^^^^^^^^

@ -1,3 +1,5 @@
.. _netscripthacknetnodeapi:
Netscript Hacknet Node API
==========================

@ -100,9 +100,10 @@ let NetscriptFunctions =
"getActionTime|getActionEstimatedSuccessChance|getActionCountRemaining|" +
"getActionMaxLevel|getActionCurrentLevel|getActionAutolevel|" +
"setActionAutolevel|setActionLevel|" +
"getRank|getSkillPoints|getSkillLevel|upgradeSkill|getTeamSize|" +
"getRank|getSkillPoints|getSkillLevel|getSkillUpgradeCost|" +
"upgradeSkill|getTeamSize|" +
"setTeamSize|getCityEstimatedPopulation|getCityEstimatedCommunities|" +
"getCityChaos|switchCity|getStamina|joinBladeburnerFaction";
"getCityChaos|switchCity|getStamina|joinBladeburnerFaction|getBonusTime";
var NetscriptHighlightRules = function(options) {
var keywordMapper = this.createKeywordMapper({

@ -1575,7 +1575,7 @@ function initAugmentations() {
"AR HUD and assist the user in field missions.<br><br>" +
"This augmentation:<br>" +
"Increases the player's success chance in Bladeburner contracts/operations by 3%.<br>" +
"Increases the player's dexterity by 3%."
"Increases the player's dexterity by 5%."
});
EsperEyewear.addToFactions([BladeburnersFactionName]);
resetAugmentation(EsperEyewear);
@ -1589,7 +1589,7 @@ function initAugmentations() {
"This augmentation:<br>" +
"Increases the player's sucess chance in Bladeburner contracts/operations by 3%.<br>" +
"Increases the player's effectiveness in Bladeburner Field Analysis by 5%.<br>" +
"Increases the player's Bladeburner stamina gain rate by 1%."
"Increases the player's Bladeburner stamina gain rate by 2%."
});
EMS4Recombination.addToFactions([BladeburnersFactionName]);
resetAugmentation(EMS4Recombination);
@ -1602,7 +1602,7 @@ function initAugmentations() {
"crystallized graphene plating.<br><br>" +
"This augmentation:<br>" +
"Increases the player's defense by 5%.<br>" +
"Increases the player's strength and dexterity by 3%.<br>" +
"Increases the player's strength and dexterity by 5%.<br>" +
"Increases the player's success chance in Bladeburner contracts/operations by 4%."
});
OrionShoulder.addToFactions([BladeburnersFactionName]);
@ -1617,7 +1617,7 @@ function initAugmentations() {
"it can also be effective against non-augmented enemies due to its high temperature " +
"and concussive force.<br><br>" +
"This augmentation:<br>" +
"Increases the player's success chance in Bladeburner contracts/operations by 5%."
"Increases the player's success chance in Bladeburner contracts/operations by 6%."
});
HyperionV1.addToFactions([BladeburnersFactionName]);
resetAugmentation(HyperionV1);
@ -1629,7 +1629,7 @@ function initAugmentations() {
"more power-efficiency, more accurate, and can fire plasma bolts at a much " +
"higher velocity than the V1 model.<br><br>" +
"This augmentation:<br>" +
"Increases the player's success chance in Bladeburner contracts/operations by 7%.",
"Increases the player's success chance in Bladeburner contracts/operations by 8%.",
prereqs:[AugmentationNames.HyperionV1]
});
HyperionV2.addToFactions([BladeburnersFactionName]);
@ -1642,7 +1642,7 @@ function initAugmentations() {
"serum was originally developed by the Chinese military in an attempt to " +
"create super soldiers.<br><br>" +
"This augmentation:<br>" +
"Increases all of the player's combat stats by 5%.<br>" +
"Increases all of the player's combat stats by 7%.<br>" +
"Increases the player's Bladeburner stamina gain rate by 5%.<br>"
});
GolemSerum.addToFactions([BladeburnersFactionName]);
@ -1655,7 +1655,7 @@ function initAugmentations() {
"This augmentation:<br>" +
"Increases the player's effectiveness in Bladeburner Field Analysis by 10%.<br>" +
"Increases the player's success chance in Bladeburner contracts/operations by 4%.<br>" +
"Increases the player's dexterity experience gain rate by 5%."
"Increases the player's dexterity experience gain rate by 10%."
});
VangelisVirus.addToFactions([BladeburnersFactionName]);
resetAugmentation(VangelisVirus);
@ -1668,7 +1668,7 @@ function initAugmentations() {
"agility/reflexes.<br><br>" +
"This augmentation:<br>" +
"Increases the player's effectiveness in Bladeburner Field Analysis by 15%.<br>" +
"Increases the player's defense and dexterity experience gain rate by 5%.<br>" +
"Increases the player's defense and dexterity experience gain rate by 10%.<br>" +
"Increases the player's success chance in Bladeburner contracts/operations by 5%.",
prereqs:[AugmentationNames.VangelisVirus]
});
@ -1682,7 +1682,7 @@ function initAugmentations() {
"structurally support the body and grants heightened strength and " +
"durability.<br><br>" +
"This augmentation:<br>" +
"Increases the player's experience gain rate for all combat stats by 4%.<br>" +
"Increases the player's experience gain rate for all combat stats by 5%.<br>" +
"Increases the player's Bladeburner max stamina by 10%."
});
INTERLINKED.addToFactions([BladeburnersFactionName]);
@ -1709,7 +1709,7 @@ function initAugmentations() {
"concussive, thermal, chemical, and electric trauma. It also enhances the user's " +
"strength and agility.<br><br>" +
"This augmentation:<br>" +
"Increases all of the player's combat stats by 2%.<br>" +
"Increases all of the player's combat stats by 4%.<br>" +
"Increases the player's Bladeburner stamina gain rate by 2%.<br>" +
"Increases the player's success chance in Bladeburner contracts/operations by 3%.",
});
@ -1780,7 +1780,7 @@ function initAugmentations() {
resetAugmentation(BladeArmorIPU);
var BladesSimulacrum = new Augmentation({
name:AugmentationNames.BladesSimulacrum, repCost:6e3, moneyCost:75e9,
name:AugmentationNames.BladesSimulacrum, repCost:3e3, moneyCost:80e9,
info:"A highly-advanced matter phase-shifter module that is embedded " +
"in the brainstem and cerebellum. This augmentation allows " +
"the user to project and control a holographic simulacrum within an " +
@ -2297,48 +2297,48 @@ function applyAugmentation(aug, reapply=false) {
//Bladeburner augmentations
case AugmentationNames.EsperEyewear:
Player.bladeburner_success_chance_mult *= 1.03;
Player.dexterity_mult *= 1.03;
Player.dexterity_mult *= 1.05;
break;
case AugmentationNames.EMS4Recombination:
Player.bladeburner_success_chance_mult *= 1.03;
Player.bladeburner_analysis_mult *= 1.05;
Player.bladeburner_stamina_gain_mult *= 1.01;
Player.bladeburner_stamina_gain_mult *= 1.02;
break;
case AugmentationNames.OrionShoulder:
Player.defense_mult *= 1.05;
Player.strength_mult *= 1.03;
Player.dexterity_mult *= 1.03;
Player.strength_mult *= 1.05;
Player.dexterity_mult *= 1.05;
Player.bladeburner_success_chance_mult *= 1.04;
break;
case AugmentationNames.HyperionV1:
Player.bladeburner_success_chance_mult *= 1.05;
Player.bladeburner_success_chance_mult *= 1.06;
break;
case AugmentationNames.HyperionV2:
Player.bladeburner_success_chance_mult *= 1.07;
Player.bladeburner_success_chance_mult *= 1.08;
break;
case AugmentationNames.GolemSerum:
Player.strength_mult *= 1.05;
Player.defense_mult *= 1.05;
Player.dexterity_mult *= 1.05;
Player.agility_mult *= 1.05;
Player.strength_mult *= 1.07;
Player.defense_mult *= 1.07;
Player.dexterity_mult *= 1.07;
Player.agility_mult *= 1.07;
Player.bladeburner_stamina_gain_mult *= 1.05;
break;
case AugmentationNames.VangelisVirus:
Player.dexterity_exp_mult *= 1.05;
Player.dexterity_exp_mult *= 1.1;
Player.bladeburner_analysis_mult *= 1.1;
Player.bladeburner_success_chance_mult *= 1.04;
break;
case AugmentationNames.VangelisVirus3:
Player.defense_exp_mult *= 1.05;
Player.dexterity_exp_mult *= 1.05;
Player.defense_exp_mult *= 1.1;
Player.dexterity_exp_mult *= 1.1;
Player.bladeburner_analysis_mult *= 1.15;
Player.bladeburner_success_chance_mult *= 1.05;
break;
case AugmentationNames.INTERLINKED:
Player.strength_exp_mult *= 1.04;
Player.defense_exp_mult *= 1.04;
Player.dexterity_exp_mult *= 1.04;
Player.agility_exp_mult *= 1.04;
Player.strength_exp_mult *= 1.05;
Player.defense_exp_mult *= 1.05;
Player.dexterity_exp_mult *= 1.05;
Player.agility_exp_mult *= 1.05;
Player.bladeburner_max_stamina_mult *= 1.1;
break;
case AugmentationNames.BladeRunner:
@ -2347,10 +2347,10 @@ function applyAugmentation(aug, reapply=false) {
Player.bladeburner_stamina_gain_mult *= 1.05;
break;
case AugmentationNames.BladeArmor:
Player.strength_mult *= 1.02;
Player.defense_mult *= 1.02;
Player.dexterity_mult *= 1.02;
Player.agility_mult *= 1.02;
Player.strength_mult *= 1.04;
Player.defense_mult *= 1.04;
Player.dexterity_mult *= 1.04;
Player.agility_mult *= 1.04;
Player.bladeburner_stamina_gain_mult *= 1.02;
Player.bladeburner_success_chance_mult *= 1.03;
break;

@ -62,12 +62,12 @@ var ActionCountGrowthPeriod = 300; //Time (s) it takes for action count to g
var RankToFactionRepFactor = 2; //Delta Faction Rep = this * Delta Rank
var RankNeededForFaction = 25;
var ContractSuccessesPerLevel = 3; //How many successes you need to level up a contract
var OperationSuccessesPerLevel = 2.5; //How many successes you need to level up an op
var ContractSuccessesPerLevel = 3.5; //How many successes you need to level up a contract
var OperationSuccessesPerLevel = 3; //How many successes you need to level up an op
var RanksPerSkillPoint = 4; //How many ranks needed to get 1 Skill Point
var ContractBaseMoneyGain = 40e3; //Base Money Gained per contract
var ContractBaseMoneyGain = 50e3; //Base Money Gained per contract
//DOM related variables
var ActiveActionCssClass = "bladeburner-active-action";
@ -214,8 +214,8 @@ function City(params={}) {
this.popEst = this.pop * (Math.random() + 0.5);
//Number of Synthoid communities population and estimate
this.comms = params.comms ? params.comms : getRandomInt(1, 40);
this.commsEst = this.comms + getRandomInt(-2, 2);
this.comms = params.comms ? params.comms : getRandomInt(5, 100);
this.commsEst = this.comms + getRandomInt(-5, 5);
if (this.commsEst < 0) {this.commsEst = 0;}
this.chaos = 0;
}
@ -734,7 +734,7 @@ Bladeburner.prototype.create = function() {
"whatever city you are currently in.",
baseDifficulty:125,difficultyFac:1.02,rewardFac:1.041,
rankGain:0.3, hpLoss:0.5,
count:getRandomInt(300, 800), countGrowth:getRandomInt(1, 5),
count:getRandomInt(100, 500), countGrowth:getRandomInt(5, 75)/10,
weights:{hack:0,str:0.05,def:0.05,dex:0.35,agi:0.35,cha:0.1, int:0.05},
decays:{hack:0,str:0.91,def:0.91,dex:0.91,agi:0.91,cha:0.9, int:1},
isStealth:true
@ -746,7 +746,7 @@ Bladeburner.prototype.create = function() {
"current city, and will also increase its chaos level.",
baseDifficulty:250, difficultyFac:1.04,rewardFac:1.085,
rankGain:0.9, hpLoss:1,
count:getRandomInt(200, 750), countGrowth:getRandomInt(1, 3),
count:getRandomInt(25, 750), countGrowth:getRandomInt(5, 75)/10,
weights:{hack:0,str:0.15,def:0.15,dex:0.25,agi:0.25,cha:0.1, int:0.1},
decays:{hack:0,str:0.91,def:0.91,dex:0.91,agi:0.91,cha:0.8, int:0.9},
isKill:true
@ -758,7 +758,7 @@ Bladeburner.prototype.create = function() {
"city, and will also increase its chaos level.",
baseDifficulty:200, difficultyFac:1.03, rewardFac:1.065,
rankGain:0.6, hpLoss:1,
count:getRandomInt(300, 900), countGrowth:getRandomInt(1,4),
count:getRandomInt(50, 1000), countGrowth:getRandomInt(5,75)/10,
weights:{hack:0,str:0.2,def:0.2,dex:0.2,agi:0.2,cha:0.1, int:0.1},
decays:{hack:0,str:0.91,def:0.91,dex:0.91,agi:0.91,cha:0.8, int:0.9},
isKill:true
@ -772,8 +772,8 @@ Bladeburner.prototype.create = function() {
"synthoid data.<br><br>" +
"You will NOT lose HP from failed Investigation ops.",
baseDifficulty:400, difficultyFac:1.03,rewardFac:1.07,reqdRank:25,
rankGain:2, rankLoss:0.2,
count:getRandomInt(50, 400), countGrowth:1,
rankGain:2.2, rankLoss:0.2,
count:getRandomInt(50, 200), countGrowth:getRandomInt(10, 40)/10,
weights:{hack:0.25,str:0.05,def:0.05,dex:0.2,agi:0.1,cha:0.25, int:0.1},
decays:{hack:0.85,str:0.9,def:0.9,dex:0.9,agi:0.9,cha:0.7, int:0.9},
isStealth:true
@ -785,8 +785,8 @@ Bladeburner.prototype.create = function() {
"Successful Undercover ops will increase the accuracy of your synthoid " +
"data.",
baseDifficulty:500, difficultyFac:1.04, rewardFac:1.09, reqdRank:100,
rankGain:4, rankLoss:0.4, hpLoss:2,
count:getRandomInt(50, 300), countGrowth:1,
rankGain:4.4, rankLoss:0.4, hpLoss:2,
count:getRandomInt(25, 300), countGrowth:getRandomInt(10, 40)/10,
weights:{hack:0.2,str:0.05,def:0.05,dex:0.2,agi:0.2,cha:0.2, int:0.1},
decays:{hack:0.8,str:0.9,def:0.9,dex:0.9,agi:0.9,cha:0.7, int:0.9},
isStealth:true
@ -796,8 +796,8 @@ Bladeburner.prototype.create = function() {
desc:"Conduct a sting operation to bait and capture particularly " +
"notorious Synthoid criminals.",
baseDifficulty:650, difficultyFac:1.04, rewardFac:1.095, reqdRank:500,
rankGain:5, rankLoss:0.5, hpLoss:2.5,
count:getRandomInt(25,400), countGrowth:0.75,
rankGain:5.5, rankLoss:0.5, hpLoss:2.5,
count:getRandomInt(25,400), countGrowth:getRandomInt(3, 40)/10,
weights:{hack:0.25,str:0.05,def:0.05,dex:0.25,agi:0.1,cha:0.2, int:0.1},
decays:{hack:0.8,str:0.85,def:0.85,dex:0.85,agi:0.85,cha:0.7, int:0.9},
isStealth:true
@ -808,8 +808,8 @@ Bladeburner.prototype.create = function() {
"there must be an existing Synthoid community in your current city " +
"in order for this Operation to be successful",
baseDifficulty:800, difficultyFac:1.045, rewardFac:1.1, reqdRank:3000,
rankGain:50,rankLoss:2.5,hpLoss:50,
count:getRandomInt(25, 150), countGrowth:0.2,
rankGain:55,rankLoss:2.5,hpLoss:50,
count:getRandomInt(25, 150), countGrowth:getRandomInt(2, 40)/10,
weights:{hack:0.1,str:0.2,def:0.2,dex:0.2,agi:0.2,cha:0, int:0.1},
decays:{hack:0.7,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.9},
isKill:true
@ -820,8 +820,8 @@ Bladeburner.prototype.create = function() {
"objective is to complete the task without " +
"drawing any attention. Stealth and discretion are key.",
baseDifficulty:1000, difficultyFac:1.05, rewardFac:1.11, reqdRank:20e3,
rankGain:20, rankLoss:2, hpLoss:10,
count:getRandomInt(25, 250), countGrowth:0.1,
rankGain:22, rankLoss:2, hpLoss:10,
count:getRandomInt(25, 250), countGrowth:getRandomInt(1, 20)/10,
weights:{hack:0.1,str:0.1,def:0.1,dex:0.3,agi:0.3,cha:0, int:0.1},
decays:{hack:0.7,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.9},
isStealth:true, isKill:true
@ -832,8 +832,8 @@ Bladeburner.prototype.create = function() {
"important, high-profile social and political leaders " +
"in the Synthoid communities.",
baseDifficulty:1500, difficultyFac:1.06, rewardFac:1.14, reqdRank:50e3,
rankGain:40, rankLoss:4, hpLoss:5,
count:getRandomInt(25, 200), countGrowth:0.1,
rankGain:44, rankLoss:4, hpLoss:5,
count:getRandomInt(25, 200), countGrowth:getRandomInt(1, 20)/10,
weights:{hack:0.1,str:0.1,def:0.1,dex:0.3,agi:0.3,cha:0, int:0.1},
decays:{hack:0.6,str:0.8,def:0.8,dex:0.8,agi:0.8,cha:0, int:0.8},
isStealth:true, isKill:true
@ -853,8 +853,12 @@ Bladeburner.prototype.process = function() {
//If the Player starts doing some other actions, set action to idle and alert
if (Augmentations[AugmentationNames.BladesSimulacrum].owned === false && Player.isWorking) {
if (this.action.type !== ActionTypes["Idle"]) {
dialogBoxCreate("Your Bladeburner action was cancelled because you started " +
"doing something else");
let msg = "Your Bladeburner action was cancelled because you started doing something else.";
if (this.automateEnabled) {
msg += `<br><br>Your automation was disabled as well. You will have to re-enable it through the Bladeburner console`
this.automateEnabled = false;
}
dialogBoxCreate(msg);
}
this.resetAction();
}
@ -1339,7 +1343,7 @@ Bladeburner.prototype.completeAction = function() {
Player.gainHackingExp(hackingExpGain);
Player.gainIntelligenceExp(BaseIntGain);
Player.gainCharismaExp(charismaExpGain);
this.changeRank(0.1);
this.changeRank(0.1 * BitNodeMultipliers.BladeburnerRank);
console.log("DEBUG: Field Analysis effectiveness is " + (eff * this.skillMultipliers.successChanceEstimate));
this.getCurrentCity().improvePopulationEstimateByPercentage(eff * this.skillMultipliers.successChanceEstimate);
if (this.logging.general) {
@ -1528,7 +1532,7 @@ Bladeburner.prototype.randomEvent = function() {
var destCity = this.cities[destCityName];
if (!(sourceCity instanceof City) || !(destCity instanceof City)) {
throw new Error("sourceCity was not a City object in Bladeburner.randomEvent()");
throw new Error("sourceCity/destCity was not a City object in Bladeburner.randomEvent()");
}
if (chance <= 0.05) {
@ -3466,6 +3470,27 @@ Bladeburner.prototype.getSkillLevelNetscriptFn = function(skillName, workerScrip
}
}
Bladeburner.prototype.getSkillUpgradeCostNetscriptFn = function(skillName, workerScript) {
var errorLogText = "ERROR: bladeburner.getSkillUpgradeCostNetscriptFn() failed due to an invalid skill specified: " +
skillName + ". Note that the name of the skill is case-sensitive";
if (skillName === "") {
return -1;
}
if (!Skills.hasOwnProperty(skillName)) {
workerScript.log(errorLogText);
return -1;
}
var skill = Skills[skillName];
if (this.skills[skillName] == null) {
return skill.calculateCost(0);
} else {
return skill.calculateCost(this.skills[skillName]);
}
}
Bladeburner.prototype.upgradeSkillNetscriptFn = function(skillName, workerScript) {
var errorLogText = "ERROR: bladeburner.upgradeSkill() failed due to an invalid skill specified: " +
skillName + ". Note that the name of the skill is case-sensitive";

@ -491,21 +491,22 @@ let CONSTANTS = {
"World Stock Exchange account and TIX API Access<br>",
LatestUpdate:
"v0.40.1 - Community Update<br>" +
"* Added getPurchasedServerCost() Netscript function (by kopelli)<br>" +
"* Added getFavorToDonate() Netscript function (by hydroflame)<br>" +
"* Added getFactionFavorGain() and getCompanyFavorGain() Singularity functions (by hydroflame)<br>" +
"* Accumulated 'bonus' time in Bladeburner is now displayed in the UI (by hydroflame)<br>" +
"* The Red Pill can now be purchased with negative money (since its supposed to be free) (by hydroflame)<br>" +
"* Cranial Signal Processor Augmentations now have the previous generation as a prerequisite. i.e. Cranial Signal Processor - Gen II requires Gen I (by Kline-)<br>" +
"* Terminal now supports semicolon usage (end of command). This allows chaining multiple Terminal commands (by hydroflame)<br>" +
"* Bladeburner Raid operations can no longer be performed if your estimate of Synthoid communities is zero (by hydroflame)<br>" +
"* The difficulty of BN-12 now scales faster (by hydroflame)<br>" +
"* Active Scripts UI now shows a RAM Usage bar for each server (by kopelli)<br>" +
"* Bug Fix: Corrected terminal timestamp format (by kopelli)<br>" +
"* Bug Fix: NetscriptJS scripts should now die properly if they don't have a 'main' function (by hydroflame)<br>" +
"* Bug Fix: write(), read(), and tryWrite() Netscript functions should now work properly for writing Arrays/objects to Netscript Ports<br>" +
"* Various minor UI/QOL fixes by hydroflame, kopelli, and Kline-"
"v0.40.2<br>" +
"* Bladeburner Changes:<br>" +
"*** Added getSkillUpgradeCost() Netscript function to the API<br>" +
"*** Added getBonusTime() Netscript function to the API<br>" +
"*** Buffed the effects of many Bladeburner Augmentations<br>" +
"*** The Blade's Simulacrum Augmentation requires significantly less reputation but slightly more money<br>" +
"*** Slightly increased the amount of successes needed for a Contract/Operation in order to increase its max level<br>" +
"*** Increased the amount of money gained from Contracts by ~25%<br>" +
"*** Increased the base amount of rank gained from Operations by 10%<br>" +
"*** Significantly increased the 'randomness' in determining a Contract/Operation's initial count and rate of count increase<br>" +
"*** The number (count) of Operations should now increase significantly faster<br>" +
"*** There are now, on average, more Synthoid communities in a city<br>" +
"*** If automation is enabled (the feature in Bladeburner console), then switching to another action such as working for a company will now disable the automation<br>" +
"* Bug Fix: Stock market should now be correctly initialized in BitNode-8 (by Kline-)<br>" +
"* Bug Fix: bladeburner.getCurrentAction() should now properly an 'Idle' object rather than null (by Kline-)<br>" +
"* Bug Fix: Bladeburner skill cost multiplier should now properly increase in BitNode-12 (by hydroflame)<br>"
}

@ -5,7 +5,7 @@ import {updateActiveScriptsItems} from "./ActiveScriptsUI";
import {Augmentations, Augmentation,
augmentationExists, installAugmentations,
AugmentationNames} from "./Augmentations";
import {BitNodeMultipliers} from "./BitNode";
import {BitNodeMultipliers} from "./BitNodeMultipliers";
import {determineCrimeSuccess, findCrime} from "./Crimes";
import {Bladeburner} from "./Bladeburner";
import {Companies, Company, CompanyPosition,
@ -3639,6 +3639,21 @@ function NetscriptFunctions(workerScript) {
throw makeRuntimeRejectMsg(workerScript, "getSkillLevel() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7");
},
getSkillUpgradeCost : function(skillName="") {
if (workerScript.checkingRam) {
return updateStaticRam("getSkillUpgradeCost", CONSTANTS.ScriptBladeburnerApiBaseRamCost);
}
updateDynamicRam("getSkillUpgradeCost", CONSTANTS.ScriptBladeburnerApiBaseRamCost);
if (Player.bladeburner instanceof Bladeburner && (Player.bitNodeN === 7 || hasBladeburner2079SF)) {
try {
return Player.bladeburner.getSkillUpgradeCostNetscriptFn(skillName, workerScript);
} catch(e) {
throw makeRuntimeRejectMsg(workerScript, "Bladeburner.getSkillUpgradeCost() failed with exception: " + e);
}
}
throw makeRuntimeRejectMsg(workerScript, "getSkillUpgradeCost() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7");
},
upgradeSkill : function(skillName) {
if (workerScript.checkingRam) {
return updateStaticRam("upgradeSkill", CONSTANTS.ScriptBladeburnerApiBaseRamCost);
@ -3786,6 +3801,14 @@ function NetscriptFunctions(workerScript) {
}
throw makeRuntimeRejectMsg(workerScript, "joinBladeburnerDivision() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7");
},
getBonusTime : function() {
if (workerScript.checkingRam) {return 0;}
if ((Player.bitNodeN === 7 || hasBladeburner2079SF)) {
return Math.round(Player.bladeburner.storedCycles / 5);
}
throw makeRuntimeRejectMsg(workerScript, "getBonusTime() failed because you do not currently have access to the Bladeburner API. This is either because you are not currently employed " +
"at the Bladeburner division or because you do not have Source-File 7");
}
}
} //End return

@ -153,6 +153,7 @@ $(document).keydown(function(e) {
let Engine = {
version: "",
Debug: true,
overview: new CharacterOverview(),
//Clickable objects
Clickables: {