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
=========
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
-------------------
* Terminal changes:

@ -1954,7 +1954,7 @@ function initAugmentations() {
resetAugmentation(BladeArmorIPU);
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 " +
"in the brainstem and cerebellum. This augmentation allows " +
"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.
// They affect how much action time is reduced based on your agility and dexterity
const EffAgiLinearFactor = 38e3;
const EffDexLinearFactor = 38e3;
const EffAgiExponentialFactor = 0.033;
const EffDexExponentialFactor = 0.03;
const EffAgiLinearFactor = 10e3;
const EffDexLinearFactor = 10e3;
const EffAgiExponentialFactor = 0.04;
const EffDexExponentialFactor = 0.035;
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 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 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 HrcStaminaGain = 0.1; // Stamina gained from Hyperbolic Regeneration Chamber
@ -497,9 +498,9 @@ Action.prototype.getSuccessChance = function(inst, params={}) {
if (!(this instanceof BlackOperation)) {
var city = inst.getCurrentCity();
if (params.est) {
competence *= (city.popEst / PopulationThreshold);
competence *= Math.pow((city.popEst / PopulationThreshold), PopulationExponent);
} else {
competence *= (city.pop / PopulationThreshold);
competence *= Math.pow((city.pop / PopulationThreshold), PopulationExponent);
}
//Too high of a chaos results in lower chances
@ -1407,7 +1408,6 @@ Bladeburner.prototype.completeAction = function() {
break;
case ActionTypes["Diplomacy"]:
var eff = this.getDiplomacyEffectiveness();
console.log(`Diplomacy Effectiveness: ${eff}`);
this.getCurrentCity().chaos *= eff;
if (this.getCurrentCity().chaos < 0) { this.getCurrentCity().chaos = 0; }
if (this.logging.general) {
@ -1547,7 +1547,7 @@ Bladeburner.prototype.getRecruitmentSuccessChance = function() {
Bladeburner.prototype.getDiplomacyEffectiveness = function() {
// 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 charismaEff = Math.pow(Player.charisma, CharismaExponentialFactor) + Player.charisma / CharismaLinearFactor;
@ -1656,7 +1656,7 @@ Bladeburner.prototype.randomEvent = function() {
}
} else if (chance <= 0.9) {
//Less Synthoids, 20%
var percentage = getRandomInt(5, 20) / 100;
var percentage = getRandomInt(8, 20) / 100;
var count = Math.round(sourceCity.pop * percentage);
sourceCity.pop -= count;
if (this.logging.events) {
@ -3882,7 +3882,7 @@ function initBladeburner() {
name:SkillNames.EvasiveSystem,
desc:"Each level of this skill increases your effective " +
"dexterity and agility for Bladeburner actions by 4%",
baseCost: 2, costInc: 1.2,
baseCost: 2, costInc: 2.1,
effDex: 4, effAgi: 4
});
Skills[SkillNames.Datamancer] = new Skill({

@ -1,7 +1,7 @@
import {IMap} from "./types";
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
//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
** 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 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
** 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)
** 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
** 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:
** 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%
* 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
`
}

@ -267,7 +267,19 @@ export function createDevMenu() {
Player.queueAugmentation(augmentationsDropdown.options[augmentationsDropdown.selectedIndex].value);
},
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
const sourceFilesHeader = createElement("h2", { innerText: "Source-Files" });
@ -621,6 +633,7 @@ export function createDevMenu() {
devMenuContainer.appendChild(augmentationsHeader);
devMenuContainer.appendChild(augmentationsDropdown);
devMenuContainer.appendChild(augmentationsQueueButton);
devMenuContainer.appendChild(giveAllAugmentationsButton);
devMenuContainer.appendChild(sourceFilesHeader);
devMenuContainer.appendChild(removeSourceFileDropdown);
devMenuContainer.appendChild(removeSourceFileButton);

@ -139,7 +139,7 @@ function displayFactionContent(factionName) {
var hackDivWrapper = createElement("div", {class:"faction-work-div-wrapper"});
hackDiv.appendChild(hackDivWrapper);
hackDivWrapper.appendChild(createElement("a", {
class:"a-link-button", innerText:"Hacking Contracts",
class:"std-button", innerText:"Hacking Contracts",
clickListener:()=>{
Player.startFactionHackWork(faction);
return false;
@ -158,7 +158,7 @@ function displayFactionContent(factionName) {
var fieldWorkDivWrapper = createElement("div", {class:"faction-work-div-wrapper"});
fieldWorkDiv.appendChild(fieldWorkDivWrapper);
fieldWorkDivWrapper.appendChild(createElement("a", {
class:"a-link-button", innerText:"Field Work",
class:"std-button", innerText:"Field Work",
clickListener:()=>{
Player.startFactionFieldWork(faction);
return false;
@ -177,7 +177,7 @@ function displayFactionContent(factionName) {
var securityWorkDivWrapper = createElement("div", {class:"faction-work-div-wrapper"});
securityWorkDiv.appendChild(securityWorkDivWrapper);
securityWorkDivWrapper.appendChild(createElement("a", {
class:"a-link-button", innerText:"Security Work",
class:"std-button", innerText:"Security Work",
clickListener:()=>{
Player.startFactionSecurityWork(faction);
return false;
@ -215,7 +215,7 @@ function displayFactionContent(factionName) {
},
});
donateDivWrapper.appendChild(createElement("a", {
class:"a-link-button", innerText:"Donate Money",
class:"std-button", innerText:"Donate Money",
clickListener:()=>{
var amt = parseFloat(donateAmountInput.value);
if (isNaN(amt) || amt < 0) {
@ -236,25 +236,6 @@ function displayFactionContent(factionName) {
donateDivWrapper.appendChild(donateRepGain);
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)
if (Player.bitNodeN == 2 && (factionName == "Slum Snakes" || factionName == "Tetrads" ||
factionName == "The Syndicate" || factionName == "The Dark Army" || factionName == "Speakers for the Dead" ||
@ -337,10 +318,10 @@ function displayFactionContent(factionName) {
// Purchase Sleeves from Covenant
if (factionName === "The Covenant" && Player.bitNodeN >= 10 && SourceFileFlags[10]) {
const covenantPurchaseSleevesDiv = createElement("div", { class: "faction-work-div" });
const covenantPurchaseSleevesDivWrapper = createElement("div", { class: "faction-wkro-div-wrapper" });
const covenantPurchaseSleevesDiv = createElement("div", { class: "faction-work-div", display: "inline" });
const covenantPurchaseSleevesDivWrapper = createElement("div", { class: "faction-work-div-wrapper" });
covenantPurchaseSleevesDiv.appendChild(covenantPurchaseSleevesDivWrapper);
covenantPurchaseSleevesDivWrapper.appendChild(createElement("button", {
covenantPurchaseSleevesDivWrapper.appendChild(createElement("a", {
class: "std-button",
innerText: "Purchase Duplicate Sleeves",
clickListener: () => {
@ -354,6 +335,29 @@ function displayFactionContent(factionName) {
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
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 {
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) {
case FactionWorkType.Hacking:
return this.getFactionHackingWorkRepGain() * (this.shock / 100);
return this.getFactionHackingWorkRepGain() * (this.shock / 100) * favorMult;
case FactionWorkType.Field:
return this.getFactionFieldWorkRepGain() * (this.shock / 100);
return this.getFactionFieldWorkRepGain() * (this.shock / 100) * favorMult;
case FactionWorkType.Security:
return this.getFactionSecurityWorkRepGain() * (this.shock / 100);
return this.getFactionSecurityWorkRepGain() * (this.shock / 100) * favorMult;
default:
console.warn(`Invalid Sleeve.factionWorkType property in Sleeve.getRepGain(): ${this.factionWorkType}`);
return 0;