Final minor changes for v0.44.0

This commit is contained in:
danielyxie 2019-02-26 00:29:53 -08:00
parent d2762a99b1
commit f1e43a86db
9 changed files with 185 additions and 121 deletions

File diff suppressed because one or more lines are too long

122
dist/vendor.bundle.js vendored

File diff suppressed because one or more lines are too long

@ -3,6 +3,44 @@
Changelog Changelog
========= =========
v0.44.0 - 2/26/2019
-------------------
* Bladeburner Changes:
** Reduced the amount of rank needed to earn a skill point
** Reduced the effects of the "Reaper" and "Evasive System" skills
** Increased the effect of the "Hyperdrive" and "Hands of Midas" skills
** Slightly increased the rate which the skill point cost rises for almost all skills
** The "Overlock" Skill now has a maximum level of 90 instead of 95
** Money earned from Contracts increased by 400%
** Changed the way population affects success rate. Extreme populations now have less dramatic effects
** Added two new General Actions: Diplomacy and Hyperbolic Regeneration Chamber
** Lowered the rep and money cost of the "Blade's Simulacrum" augmentation
** Significantly decreased the initial amount of Contracts/Operations (the "Contracts/Operations remaining" value)
** Decreased the rate at which the amount of Contracts/Operations increases over time
** Decreased the number of successes you need to increase the max level of a Contract/Operation
** Increased the average number of Synthoid communities each city has
** Reduced the amount by which a successful raid will decrease the population of a city
** The "riots" event will now increase the chaos of a city by a greater amount
** Significantly increased the effect that Agility and Dexterity have on action time
* Added new BitNode multipliers:
* HomeComputerRamCost - Affects how much it costs to upgrade home computer's RAM
* DaedalusAugsRequirement - Affects how many Augmentations you need in order to get invited to Daedalus
* FourSigmaMarketDataCost - Affects how much it costs to unlock the stock market's 4S Market Data
* FourSigmaMarketDataApiCost - Affects how much it costs to unlock the stock market's 4S Market Data API
* A few minor changes to BitNode multipliers across the board (mostly for the new multipliers)
* 'The Covenant' now requires 20 total Augmentations to get invited, rather than 30
* You can now purchase permanent Duplicate Sleeves from 'The Covenant'. This requires Source-File 10, and you must be in BN-10 or after
* You can now track where all of your money comes from in the 'Stats' page
* Increased the money gained from Coding Contracts by 50%
* getCharacterInformation() function now returns the player's HP and max HP
* Bug Fix: You can no longer disconnect the enemy's connections in Hacking Missions
* Bug Fix: Duplicate Sleeve faction reputation gain is now properly affected by faction favor
* Bug Fix: After installing Augmentations, the Terminal display will now correctly show the current server as "home"
* Bug Fix: Fixed an exploit where you could change the duration of timed functions (e.g. hack, weaken) in NetscriptJS
* Bug Fix: You should now properly be able to use the ServerProfile.exe program
* Bug Fix: Prevented exploit that allowed you to accept faction invites programmatically through NetscriptJS
* Bug Fix: Faction invitations for megacorporations should now work properly
v0.43.1 - 2/11/2019 v0.43.1 - 2/11/2019
------------------- -------------------
* Terminal changes: * Terminal changes:

@ -1954,7 +1954,7 @@ function initAugmentations() {
resetAugmentation(BladeArmorIPU); resetAugmentation(BladeArmorIPU);
var BladesSimulacrum = new Augmentation({ var BladesSimulacrum = new Augmentation({
name:AugmentationNames.BladesSimulacrum, repCost: 1e3, moneyCost: 100e9, name:AugmentationNames.BladesSimulacrum, repCost: 500, moneyCost: 30e9,
info:"A highly-advanced matter phase-shifter module that is embedded " + info:"A highly-advanced matter phase-shifter module that is embedded " +
"in the brainstem and cerebellum. This augmentation allows " + "in the brainstem and cerebellum. This augmentation allows " +
"the user to project and control a holographic simulacrum within an " + "the user to project and control a holographic simulacrum within an " +

@ -50,14 +50,15 @@ const DiffMultLinearFactor = 650;
// These factors are used to calculate action time. // These factors are used to calculate action time.
// They affect how much action time is reduced based on your agility and dexterity // They affect how much action time is reduced based on your agility and dexterity
const EffAgiLinearFactor = 38e3; const EffAgiLinearFactor = 10e3;
const EffDexLinearFactor = 38e3; const EffDexLinearFactor = 10e3;
const EffAgiExponentialFactor = 0.033; const EffAgiExponentialFactor = 0.04;
const EffDexExponentialFactor = 0.03; const EffDexExponentialFactor = 0.035;
const BaseRecruitmentTimeNeeded = 300; //Base time needed (s) to complete a Recruitment action const BaseRecruitmentTimeNeeded = 300; //Base time needed (s) to complete a Recruitment action
const PopulationThreshold = 1e9; //Population at which success rates start being affected const PopulationThreshold = 1e9; // Population which determines baseline success rate
const PopulationExponent = 0.7; // Exponent that influences how different populations affect success rate
const ChaosThreshold = 50; //City chaos level after which it starts making tasks harder const ChaosThreshold = 50; //City chaos level after which it starts making tasks harder
const BaseStatGain = 1; //Base stat gain per second const BaseStatGain = 1; //Base stat gain per second
@ -73,7 +74,7 @@ const OperationSuccessesPerLevel = 2.5; //How many successes you need to level
const RanksPerSkillPoint = 3; //How many ranks needed to get 1 Skill Point const RanksPerSkillPoint = 3; //How many ranks needed to get 1 Skill Point
const ContractBaseMoneyGain = 100e3; //Base Money Gained per contract const ContractBaseMoneyGain = 250e3; //Base Money Gained per contract
const HrcHpGain = 2; // HP gained from Hyperbolic Regeneration Chamber const HrcHpGain = 2; // HP gained from Hyperbolic Regeneration Chamber
const HrcStaminaGain = 0.1; // Stamina gained from Hyperbolic Regeneration Chamber const HrcStaminaGain = 0.1; // Stamina gained from Hyperbolic Regeneration Chamber
@ -497,9 +498,9 @@ Action.prototype.getSuccessChance = function(inst, params={}) {
if (!(this instanceof BlackOperation)) { if (!(this instanceof BlackOperation)) {
var city = inst.getCurrentCity(); var city = inst.getCurrentCity();
if (params.est) { if (params.est) {
competence *= (city.popEst / PopulationThreshold); competence *= Math.pow((city.popEst / PopulationThreshold), PopulationExponent);
} else { } else {
competence *= (city.pop / PopulationThreshold); competence *= Math.pow((city.pop / PopulationThreshold), PopulationExponent);
} }
//Too high of a chaos results in lower chances //Too high of a chaos results in lower chances
@ -1407,7 +1408,6 @@ Bladeburner.prototype.completeAction = function() {
break; break;
case ActionTypes["Diplomacy"]: case ActionTypes["Diplomacy"]:
var eff = this.getDiplomacyEffectiveness(); var eff = this.getDiplomacyEffectiveness();
console.log(`Diplomacy Effectiveness: ${eff}`);
this.getCurrentCity().chaos *= eff; this.getCurrentCity().chaos *= eff;
if (this.getCurrentCity().chaos < 0) { this.getCurrentCity().chaos = 0; } if (this.getCurrentCity().chaos < 0) { this.getCurrentCity().chaos = 0; }
if (this.logging.general) { if (this.logging.general) {
@ -1547,7 +1547,7 @@ Bladeburner.prototype.getRecruitmentSuccessChance = function() {
Bladeburner.prototype.getDiplomacyEffectiveness = function() { Bladeburner.prototype.getDiplomacyEffectiveness = function() {
// Returns a decimal by which the city's chaos level should be multiplied (e.g. 0.98) // Returns a decimal by which the city's chaos level should be multiplied (e.g. 0.98)
const CharismaLinearFactor = 4e3; const CharismaLinearFactor = 1e3;
const CharismaExponentialFactor = 0.045; const CharismaExponentialFactor = 0.045;
const charismaEff = Math.pow(Player.charisma, CharismaExponentialFactor) + Player.charisma / CharismaLinearFactor; const charismaEff = Math.pow(Player.charisma, CharismaExponentialFactor) + Player.charisma / CharismaLinearFactor;
@ -1656,7 +1656,7 @@ Bladeburner.prototype.randomEvent = function() {
} }
} else if (chance <= 0.9) { } else if (chance <= 0.9) {
//Less Synthoids, 20% //Less Synthoids, 20%
var percentage = getRandomInt(5, 20) / 100; var percentage = getRandomInt(8, 20) / 100;
var count = Math.round(sourceCity.pop * percentage); var count = Math.round(sourceCity.pop * percentage);
sourceCity.pop -= count; sourceCity.pop -= count;
if (this.logging.events) { if (this.logging.events) {
@ -3882,7 +3882,7 @@ function initBladeburner() {
name:SkillNames.EvasiveSystem, name:SkillNames.EvasiveSystem,
desc:"Each level of this skill increases your effective " + desc:"Each level of this skill increases your effective " +
"dexterity and agility for Bladeburner actions by 4%", "dexterity and agility for Bladeburner actions by 4%",
baseCost: 2, costInc: 1.2, baseCost: 2, costInc: 2.1,
effDex: 4, effAgi: 4 effDex: 4, effAgi: 4
}); });
Skills[SkillNames.Datamancer] = new Skill({ Skills[SkillNames.Datamancer] = new Skill({

@ -1,7 +1,7 @@
import {IMap} from "./types"; import {IMap} from "./types";
export let CONSTANTS: IMap<any> = { export let CONSTANTS: IMap<any> = {
Version: "0.43.1", Version: "0.44.0",
//Max level for any skill, assuming no multipliers. Determined by max numerical value in javascript for experience //Max level for any skill, assuming no multipliers. Determined by max numerical value in javascript for experience
//and the skill level formula in Player.js. Note that all this means it that when experience hits MAX_INT, then //and the skill level formula in Player.js. Note that all this means it that when experience hits MAX_INT, then
@ -517,16 +517,17 @@ export let CONSTANTS: IMap<any> = {
** Increased the effect of the "Hyperdrive" and "Hands of Midas" skills ** Increased the effect of the "Hyperdrive" and "Hands of Midas" skills
** Slightly increased the rate which the skill point cost rises for almost all skills ** Slightly increased the rate which the skill point cost rises for almost all skills
** The "Overlock" Skill now has a maximum level of 90 instead of 95 ** The "Overlock" Skill now has a maximum level of 90 instead of 95
** Money earned from Contracts increased by 100% ** Money earned from Contracts increased by 400%
** Changed the way population affects success rate. Extreme populations now have less dramatic effects
** Added two new General Actions: Diplomacy and Hyperbolic Regeneration Chamber ** Added two new General Actions: Diplomacy and Hyperbolic Regeneration Chamber
** Lowered the rep cost of the "Blade's Simulacrum" augmentation, but increased the price ** Lowered the rep and money cost of the "Blade's Simulacrum" augmentation
** Significantly decreased the initial amount of Contracts/Operations (the "Contracts/Operations remaining" value) ** Significantly decreased the initial amount of Contracts/Operations (the "Contracts/Operations remaining" value)
** Decreased the rate at which the amount of Contracts/Operations increases over time ** Decreased the rate at which the amount of Contracts/Operations increases over time
** Decreased the number of successes you need to increase the max level of a Contract/Operation ** Decreased the number of successes you need to increase the max level of a Contract/Operation
** Increased the average number of Synthoid communities each city has ** Increased the average number of Synthoid communities each city has
** Reduced the amount by which a successful raid will decrease the population of a city ** Reduced the amount by which a successful raid will decrease the population of a city
** The "riots" event will now increase the chaos of a city by a greater amount ** The "riots" event will now increase the chaos of a city by a greater amount
** Slightly increased the effect that Agility and Dexterity have on action time ** Significantly increased the effect that Agility and Dexterity have on action time
* Added new BitNode multipliers: * Added new BitNode multipliers:
** HomeComputerRamCost - Affects how much it costs to upgrade home computer's RAM ** HomeComputerRamCost - Affects how much it costs to upgrade home computer's RAM
@ -541,10 +542,12 @@ export let CONSTANTS: IMap<any> = {
* Increased the money gained from Coding Contracts by 50% * Increased the money gained from Coding Contracts by 50%
* getCharacterInformation() function now returns the player's HP and max HP * getCharacterInformation() function now returns the player's HP and max HP
* Bug Fix: You can no longer disconnect the enemy's connections in Hacking Missions * Bug Fix: You can no longer disconnect the enemy's connections in Hacking Missions
* Bug Fix: Duplicate Sleeve faction reputation gain is now properly affected by faction favor
* Bug Fix: After installing Augmentations, the Terminal display will now correctly show the current server as "home" * Bug Fix: After installing Augmentations, the Terminal display will now correctly show the current server as "home"
* Bug Fix: Fixed an exploit where you could change the duration of timed functions (e.g. hack, weaken) in NetscriptJS * Bug Fix: Fixed an exploit where you could change the duration of timed functions (e.g. hack, weaken) in NetscriptJS
* Bug Fix: You should now properly be able to use the ServerProfile.exe program * Bug Fix: You should now properly be able to use the ServerProfile.exe program
* Bug Fix: Prevented exploit that allowed you to accept faction invites programmatically through NetscriptJS * Bug Fix: Prevented exploit that allowed you to accept faction invites programmatically through NetscriptJS
* Bug Fix: Faction invitations for megacorporations should now work properly
` `
} }

@ -267,7 +267,19 @@ export function createDevMenu() {
Player.queueAugmentation(augmentationsDropdown.options[augmentationsDropdown.selectedIndex].value); Player.queueAugmentation(augmentationsDropdown.options[augmentationsDropdown.selectedIndex].value);
}, },
innerText: "Queue Augmentation", innerText: "Queue Augmentation",
}) });
const giveAllAugmentationsButton = createElement("button", {
class: "std-button",
clickListener: () => {
for (const i in AugmentationNames) {
const augName = AugmentationNames[i];
Player.queueAugmentation(augName);
}
},
display: "block",
innerText: "Queue All Augmentations",
});
// Source Files // Source Files
const sourceFilesHeader = createElement("h2", { innerText: "Source-Files" }); const sourceFilesHeader = createElement("h2", { innerText: "Source-Files" });
@ -621,6 +633,7 @@ export function createDevMenu() {
devMenuContainer.appendChild(augmentationsHeader); devMenuContainer.appendChild(augmentationsHeader);
devMenuContainer.appendChild(augmentationsDropdown); devMenuContainer.appendChild(augmentationsDropdown);
devMenuContainer.appendChild(augmentationsQueueButton); devMenuContainer.appendChild(augmentationsQueueButton);
devMenuContainer.appendChild(giveAllAugmentationsButton);
devMenuContainer.appendChild(sourceFilesHeader); devMenuContainer.appendChild(sourceFilesHeader);
devMenuContainer.appendChild(removeSourceFileDropdown); devMenuContainer.appendChild(removeSourceFileDropdown);
devMenuContainer.appendChild(removeSourceFileButton); devMenuContainer.appendChild(removeSourceFileButton);

@ -139,7 +139,7 @@ function displayFactionContent(factionName) {
var hackDivWrapper = createElement("div", {class:"faction-work-div-wrapper"}); var hackDivWrapper = createElement("div", {class:"faction-work-div-wrapper"});
hackDiv.appendChild(hackDivWrapper); hackDiv.appendChild(hackDivWrapper);
hackDivWrapper.appendChild(createElement("a", { hackDivWrapper.appendChild(createElement("a", {
class:"a-link-button", innerText:"Hacking Contracts", class:"std-button", innerText:"Hacking Contracts",
clickListener:()=>{ clickListener:()=>{
Player.startFactionHackWork(faction); Player.startFactionHackWork(faction);
return false; return false;
@ -158,7 +158,7 @@ function displayFactionContent(factionName) {
var fieldWorkDivWrapper = createElement("div", {class:"faction-work-div-wrapper"}); var fieldWorkDivWrapper = createElement("div", {class:"faction-work-div-wrapper"});
fieldWorkDiv.appendChild(fieldWorkDivWrapper); fieldWorkDiv.appendChild(fieldWorkDivWrapper);
fieldWorkDivWrapper.appendChild(createElement("a", { fieldWorkDivWrapper.appendChild(createElement("a", {
class:"a-link-button", innerText:"Field Work", class:"std-button", innerText:"Field Work",
clickListener:()=>{ clickListener:()=>{
Player.startFactionFieldWork(faction); Player.startFactionFieldWork(faction);
return false; return false;
@ -177,7 +177,7 @@ function displayFactionContent(factionName) {
var securityWorkDivWrapper = createElement("div", {class:"faction-work-div-wrapper"}); var securityWorkDivWrapper = createElement("div", {class:"faction-work-div-wrapper"});
securityWorkDiv.appendChild(securityWorkDivWrapper); securityWorkDiv.appendChild(securityWorkDivWrapper);
securityWorkDivWrapper.appendChild(createElement("a", { securityWorkDivWrapper.appendChild(createElement("a", {
class:"a-link-button", innerText:"Security Work", class:"std-button", innerText:"Security Work",
clickListener:()=>{ clickListener:()=>{
Player.startFactionSecurityWork(faction); Player.startFactionSecurityWork(faction);
return false; return false;
@ -215,7 +215,7 @@ function displayFactionContent(factionName) {
}, },
}); });
donateDivWrapper.appendChild(createElement("a", { donateDivWrapper.appendChild(createElement("a", {
class:"a-link-button", innerText:"Donate Money", class:"std-button", innerText:"Donate Money",
clickListener:()=>{ clickListener:()=>{
var amt = parseFloat(donateAmountInput.value); var amt = parseFloat(donateAmountInput.value);
if (isNaN(amt) || amt < 0) { if (isNaN(amt) || amt < 0) {
@ -236,25 +236,6 @@ function displayFactionContent(factionName) {
donateDivWrapper.appendChild(donateRepGain); donateDivWrapper.appendChild(donateRepGain);
elements.push(donateDiv); elements.push(donateDiv);
//Purchase Augmentations
elements.push(createElement("pre", {
innerHTML: "<br>As your reputation with this faction rises, you will " +
"unlock Augmentations, which you can purchase to enhance " +
"your abilities.<br><br>"
}));
elements.push(createElement("a", {
class:"std-button",
innerText:"Purchase Augmentations",
margin: "5px",
clickListener:()=>{
Engine.hideAllContent();
Engine.Display.factionAugmentationsContent.style.display = "block";
displayFactionAugmentations(factionName);
return false;
}
}));
//Gang (BitNode-2) //Gang (BitNode-2)
if (Player.bitNodeN == 2 && (factionName == "Slum Snakes" || factionName == "Tetrads" || if (Player.bitNodeN == 2 && (factionName == "Slum Snakes" || factionName == "Tetrads" ||
factionName == "The Syndicate" || factionName == "The Dark Army" || factionName == "Speakers for the Dead" || factionName == "The Syndicate" || factionName == "The Dark Army" || factionName == "Speakers for the Dead" ||
@ -337,10 +318,10 @@ function displayFactionContent(factionName) {
// Purchase Sleeves from Covenant // Purchase Sleeves from Covenant
if (factionName === "The Covenant" && Player.bitNodeN >= 10 && SourceFileFlags[10]) { if (factionName === "The Covenant" && Player.bitNodeN >= 10 && SourceFileFlags[10]) {
const covenantPurchaseSleevesDiv = createElement("div", { class: "faction-work-div" }); const covenantPurchaseSleevesDiv = createElement("div", { class: "faction-work-div", display: "inline" });
const covenantPurchaseSleevesDivWrapper = createElement("div", { class: "faction-wkro-div-wrapper" }); const covenantPurchaseSleevesDivWrapper = createElement("div", { class: "faction-work-div-wrapper" });
covenantPurchaseSleevesDiv.appendChild(covenantPurchaseSleevesDivWrapper); covenantPurchaseSleevesDiv.appendChild(covenantPurchaseSleevesDivWrapper);
covenantPurchaseSleevesDivWrapper.appendChild(createElement("button", { covenantPurchaseSleevesDivWrapper.appendChild(createElement("a", {
class: "std-button", class: "std-button",
innerText: "Purchase Duplicate Sleeves", innerText: "Purchase Duplicate Sleeves",
clickListener: () => { clickListener: () => {
@ -354,6 +335,29 @@ function displayFactionContent(factionName) {
elements.push(covenantPurchaseSleevesDiv); elements.push(covenantPurchaseSleevesDiv);
} }
//Purchase Augmentations
const purchaseAugmentationsDiv = createElement("div", { class: "faction-work-div", display: "inline" });
const purchaseAugmentationsDivWrapper = createElement("div", { class: "faction-work-div-wrapper" });
purchaseAugmentationsDiv.appendChild(purchaseAugmentationsDivWrapper);
purchaseAugmentationsDivWrapper.appendChild(createElement("a", {
class:"std-button",
innerText:"Purchase Augmentations",
margin: "5px",
clickListener:()=>{
Engine.hideAllContent();
Engine.Display.factionAugmentationsContent.style.display = "block";
displayFactionAugmentations(factionName);
return false;
}
}));
purchaseAugmentationsDivWrapper.appendChild(createElement("pre", {
innerHTML: "<br>As your reputation with this faction rises, you will " +
"unlock Augmentations, which you can purchase to enhance " +
"your abilities.<br><br>"
}));
elements.push(purchaseAugmentationsDiv);
// Determine if actions should be possible // Determine if actions should be possible
donateDiv.style.display = faction.favor >= Math.floor(CONSTANTS.BaseFavorToDonate * BitNodeMultipliers.RepToDonateToFaction) ? "inline" : "none"; donateDiv.style.display = faction.favor >= Math.floor(CONSTANTS.BaseFavorToDonate * BitNodeMultipliers.RepToDonateToFaction) ? "inline" : "none";

@ -338,13 +338,19 @@ export class Sleeve extends Person {
*/ */
getRepGain(p: IPlayer): number { getRepGain(p: IPlayer): number {
if (this.currentTask === SleeveTaskType.Faction) { if (this.currentTask === SleeveTaskType.Faction) {
let favorMult: number = 1;
const fac: Faction | null = Factions[this.currentTaskLocation];
if (fac != null) {
favorMult = 1 + (fac!.favor / 100);
}
switch (this.factionWorkType) { switch (this.factionWorkType) {
case FactionWorkType.Hacking: case FactionWorkType.Hacking:
return this.getFactionHackingWorkRepGain() * (this.shock / 100); return this.getFactionHackingWorkRepGain() * (this.shock / 100) * favorMult;
case FactionWorkType.Field: case FactionWorkType.Field:
return this.getFactionFieldWorkRepGain() * (this.shock / 100); return this.getFactionFieldWorkRepGain() * (this.shock / 100) * favorMult;
case FactionWorkType.Security: case FactionWorkType.Security:
return this.getFactionSecurityWorkRepGain() * (this.shock / 100); return this.getFactionSecurityWorkRepGain() * (this.shock / 100) * favorMult;
default: default:
console.warn(`Invalid Sleeve.factionWorkType property in Sleeve.getRepGain(): ${this.factionWorkType}`); console.warn(`Invalid Sleeve.factionWorkType property in Sleeve.getRepGain(): ${this.factionWorkType}`);
return 0; return 0;