Merge pull request #1044 from danielyxie/dev

v0.52.2
This commit is contained in:
hydroflame 2021-08-15 02:15:03 -04:00 committed by GitHub
commit 21daab32c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 374 additions and 417 deletions

File diff suppressed because one or more lines are too long

@ -1,2 +1,2 @@
!function(n){function t(t){for(var e,i,f=t[0],c=t[1],l=t[2],p=0,s=[];p<f.length;p++)i=f[p],u[i]&&s.push(u[i][0]),u[i]=0;for(e in c)Object.prototype.hasOwnProperty.call(c,e)&&(n[e]=c[e]);for(a&&a(t);s.length;)s.shift()();return r.push.apply(r,l||[]),o()}function o(){for(var n,t=0;t<r.length;t++){for(var o=r[t],e=!0,f=1;f<o.length;f++){var c=o[f];0!==u[c]&&(e=!1)}e&&(r.splice(t--,1),n=i(i.s=o[0]))}return n}var e={},u={1:0},r=[];function i(t){if(e[t])return e[t].exports;var o=e[t]={i:t,l:!1,exports:{}};return n[t].call(o.exports,o,o.exports,i),o.l=!0,o.exports}i.m=n,i.c=e,i.d=function(n,t,o){i.o(n,t)||Object.defineProperty(n,t,{enumerable:!0,get:o})},i.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},i.t=function(n,t){if(1&t&&(n=i(n)),8&t)return n;if(4&t&&"object"==typeof n&&n&&n.__esModule)return n;var o=Object.create(null);if(i.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:n}),2&t&&"string"!=typeof n)for(var e in n)i.d(o,e,function(t){return n[t]}.bind(null,e));return o},i.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return i.d(t,"a",t),t},i.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},i.p="";var f=window.webpackJsonp=window.webpackJsonp||[],c=f.push.bind(f);f.push=t,f=f.slice();for(var l=0;l<f.length;l++)t(f[l]);var a=c;r.push([852,0]),o()}({789:function(n,t,o){},791:function(n,t,o){},793:function(n,t,o){},795:function(n,t,o){},797:function(n,t,o){},799:function(n,t,o){},801:function(n,t,o){},803:function(n,t,o){},805:function(n,t,o){},807:function(n,t,o){},809:function(n,t,o){},811:function(n,t,o){},813:function(n,t,o){},815:function(n,t,o){},817:function(n,t,o){},819:function(n,t,o){},821:function(n,t,o){},823:function(n,t,o){},825:function(n,t,o){},827:function(n,t,o){},829:function(n,t,o){},831:function(n,t,o){},833:function(n,t,o){},835:function(n,t,o){},837:function(n,t,o){},839:function(n,t,o){},841:function(n,t,o){},843:function(n,t,o){},845:function(n,t,o){},847:function(n,t,o){},849:function(n,t,o){},852:function(n,t,o){"use strict";o.r(t);o(851),o(849),o(847),o(845),o(843),o(841),o(839),o(837),o(835),o(833),o(831),o(829),o(827),o(825),o(823),o(821),o(819),o(817),o(815),o(813),o(811),o(809),o(807),o(805),o(803),o(801),o(799),o(797),o(795),o(793),o(791),o(789)}}); !function(n){function t(t){for(var e,i,f=t[0],c=t[1],l=t[2],p=0,s=[];p<f.length;p++)i=f[p],u[i]&&s.push(u[i][0]),u[i]=0;for(e in c)Object.prototype.hasOwnProperty.call(c,e)&&(n[e]=c[e]);for(a&&a(t);s.length;)s.shift()();return r.push.apply(r,l||[]),o()}function o(){for(var n,t=0;t<r.length;t++){for(var o=r[t],e=!0,f=1;f<o.length;f++){var c=o[f];0!==u[c]&&(e=!1)}e&&(r.splice(t--,1),n=i(i.s=o[0]))}return n}var e={},u={1:0},r=[];function i(t){if(e[t])return e[t].exports;var o=e[t]={i:t,l:!1,exports:{}};return n[t].call(o.exports,o,o.exports,i),o.l=!0,o.exports}i.m=n,i.c=e,i.d=function(n,t,o){i.o(n,t)||Object.defineProperty(n,t,{enumerable:!0,get:o})},i.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},i.t=function(n,t){if(1&t&&(n=i(n)),8&t)return n;if(4&t&&"object"==typeof n&&n&&n.__esModule)return n;var o=Object.create(null);if(i.r(o),Object.defineProperty(o,"default",{enumerable:!0,value:n}),2&t&&"string"!=typeof n)for(var e in n)i.d(o,e,function(t){return n[t]}.bind(null,e));return o},i.n=function(n){var t=n&&n.__esModule?function(){return n.default}:function(){return n};return i.d(t,"a",t),t},i.o=function(n,t){return Object.prototype.hasOwnProperty.call(n,t)},i.p="";var f=window.webpackJsonp=window.webpackJsonp||[],c=f.push.bind(f);f.push=t,f=f.slice();for(var l=0;l<f.length;l++)t(f[l]);var a=c;r.push([853,0]),o()}({790:function(n,t,o){},792:function(n,t,o){},794:function(n,t,o){},796:function(n,t,o){},798:function(n,t,o){},800:function(n,t,o){},802:function(n,t,o){},804:function(n,t,o){},806:function(n,t,o){},808:function(n,t,o){},810:function(n,t,o){},812:function(n,t,o){},814:function(n,t,o){},816:function(n,t,o){},818:function(n,t,o){},820:function(n,t,o){},822:function(n,t,o){},824:function(n,t,o){},826:function(n,t,o){},828:function(n,t,o){},830:function(n,t,o){},832:function(n,t,o){},834:function(n,t,o){},836:function(n,t,o){},838:function(n,t,o){},840:function(n,t,o){},842:function(n,t,o){},844:function(n,t,o){},846:function(n,t,o){},848:function(n,t,o){},850:function(n,t,o){},853:function(n,t,o){"use strict";o.r(t);o(852),o(850),o(848),o(846),o(844),o(842),o(840),o(838),o(836),o(834),o(832),o(830),o(828),o(826),o(824),o(822),o(820),o(818),o(816),o(814),o(812),o(810),o(808),o(806),o(804),o(802),o(800),o(798),o(796),o(794),o(792),o(790)}});
//# sourceMappingURL=engineStyle.bundle.js.map //# sourceMappingURL=engineStyle.bundle.js.map

26
dist/vendor.bundle.js vendored

File diff suppressed because one or more lines are too long

@ -3,6 +3,20 @@
Changelog Changelog
========= =========
v0.52.2 - 2021-07-15 Oh yeah, BN11 is a thing (drunk hydroflame tbh)
-------------------------------------------
** Source-Files **
* Source-File 11 now also provides a small reduction to the price increase
multiplier.
** Augmentations **
* New Augmentation offered by Aevum, themed around 777 and offers some basic
programs.
* Augmentation descriptions are now more concise and consistent.
v0.52.1 - 2021-07-10 bugfixing (hydroflame & community) v0.52.1 - 2021-07-10 bugfixing (hydroflame & community)
------------------------------------------- -------------------------------------------

@ -66,7 +66,7 @@ documentation_title = '{0} Documentation'.format(project)
# The short X.Y version. # The short X.Y version.
version = '0.52' version = '0.52'
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = '0.52.1' release = '0.52.2'
# The language for content autogenerated by Sphinx. Refer to documentation # The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages. # for a list of supported languages.

@ -126,5 +126,5 @@
"watch": "webpack --watch --mode production", "watch": "webpack --watch --mode production",
"watch:dev": "webpack --watch --mode development" "watch:dev": "webpack --watch --mode development"
}, },
"version": "0.52.1" "version": "0.52.2"
} }

@ -1,14 +1,18 @@
// Class definition for a single Augmentation object // Class definition for a single Augmentation object
import * as React from "react";
import { IMap } from "../types"; import { IMap } from "../types";
import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers"; import { BitNodeMultipliers } from "../BitNode/BitNodeMultipliers";
import { Faction } from "../Faction/Faction"; import { Faction } from "../Faction/Faction";
import { Factions } from "../Faction/Factions"; import { Factions } from "../Faction/Factions";
import { numeralWrapper } from "../ui/numeralFormat";
import { Money } from "../ui/React/Money";
import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver"; import { Generic_fromJSON, Generic_toJSON, Reviver } from "../../utils/JSONReviver";
interface IConstructorParams { interface IConstructorParams {
info: string | JSX.Element; info: string | JSX.Element;
stats?: JSX.Element;
isSpecial?: boolean; isSpecial?: boolean;
moneyCost: number; moneyCost: number;
name: string; name: string;
@ -45,6 +49,129 @@ interface IConstructorParams {
bladeburner_stamina_gain_mult?: number; bladeburner_stamina_gain_mult?: number;
bladeburner_analysis_mult?: number; bladeburner_analysis_mult?: number;
bladeburner_success_chance_mult?: number; bladeburner_success_chance_mult?: number;
startingMoney?: number;
programs?: string[];
}
function generateStatsDescription(mults: IMap<number>, programs?: string[], startingMoney?: number): JSX.Element {
const f = (x: number, decimals: number = 0) => {
// look, I don't know how to make a "smart decimals"
// todo, make it smarter
if(x === 1.0777-1) return "7.77%";
if(x === 1.777-1) return "77.7%";
return numeralWrapper.formatPercentage(x, decimals);
};
let desc = <>Effects:</>;
if(mults.hacking_mult &&
mults.hacking_mult == mults.strength_mult &&
mults.hacking_mult == mults.defense_mult &&
mults.hacking_mult == mults.dexterity_mult &&
mults.hacking_mult == mults.agility_mult &&
mults.hacking_mult == mults.charisma_mult){
desc = <>{desc}<br />+{f(mults.hacking_mult-1)} all skills</>
} else {
if(mults.hacking_mult)
desc = <>{desc}<br />+{f(mults.hacking_mult-1)} hacking skill</>
if(mults.strength_mult &&
mults.strength_mult == mults.defense_mult &&
mults.strength_mult == mults.dexterity_mult &&
mults.strength_mult == mults.agility_mult) {
desc = <>{desc}<br />+{f(mults.strength_mult-1)} combat skills</>
} else {
if(mults.strength_mult)
desc = <>{desc}<br />+{f(mults.strength_mult-1)} strength skill</>
if(mults.defense_mult)
desc = <>{desc}<br />+{f(mults.defense_mult-1)} defense skill</>
if(mults.dexterity_mult)
desc = <>{desc}<br />+{f(mults.dexterity_mult-1)} dexterity skill</>
if(mults.agility_mult)
desc = <>{desc}<br />+{f(mults.agility_mult-1)} agility skill</>
}
if(mults.charisma_mult)
desc = <>{desc}<br />+{f(mults.charisma_mult-1)} Charisma skill</>
}
if(mults.hacking_exp_mult &&
mults.hacking_exp_mult === mults.strength_exp_mult &&
mults.hacking_exp_mult === mults.defense_exp_mult &&
mults.hacking_exp_mult === mults.dexterity_exp_mult &&
mults.hacking_exp_mult === mults.agility_exp_mult &&
mults.hacking_exp_mult === mults.charisma_exp_mult) {
desc = <>{desc}<br />+{f(mults.hacking_exp_mult-1)} exp for all skills</>
} else {
if(mults.hacking_exp_mult)
desc = <>{desc}<br />+{f(mults.hacking_exp_mult-1)} hacking exp</>
if(mults.strength_exp_mult &&
mults.strength_exp_mult === mults.defense_exp_mult &&
mults.strength_exp_mult === mults.dexterity_exp_mult &&
mults.strength_exp_mult === mults.agility_exp_mult) {
desc = <>{desc}<br />+{f(mults.strength_exp_mult-1)} combat exp</>
} else {
if(mults.strength_exp_mult)
desc = <>{desc}<br />+{f(mults.strength_exp_mult-1)} strength exp</>
if(mults.defense_exp_mult)
desc = <>{desc}<br />+{f(mults.defense_exp_mult-1)} defense exp</>
if(mults.dexterity_exp_mult)
desc = <>{desc}<br />+{f(mults.dexterity_exp_mult-1)} dexterity exp</>
if(mults.agility_exp_mult)
desc = <>{desc}<br />+{f(mults.agility_exp_mult-1)} agility exp</>
}
if(mults.charisma_exp_mult)
desc = <>{desc}<br />+{f(mults.charisma_exp_mult-1)} charisma exp</>
}
if(mults.hacking_speed_mult)
desc = <>{desc}<br />+{f(mults.hacking_speed_mult-1)} faster hacking</>
if(mults.hacking_chance_mult)
desc = <>{desc}<br />+{f(mults.hacking_chance_mult-1)} hack() success chance</>
if(mults.hacking_money_mult)
desc = <>{desc}<br />+{f(mults.hacking_money_mult-1)} hack() power</>
if(mults.hacking_grow_mult)
desc = <>{desc}<br />+{f(mults.hacking_grow_mult-1)} grow() power</>
if(mults.faction_rep_mult &&
mults.faction_rep_mult === mults.company_rep_mult) {
desc = <>{desc}<br />+{f(mults.faction_rep_mult-1)} reputation from factions and companies</>
} else {
if(mults.faction_rep_mult)
desc = <>{desc}<br />+{f(mults.faction_rep_mult-1)} reputation from factions</>
if(mults.company_rep_mult)
desc = <>{desc}<br />+{f(mults.company_rep_mult-1)} reputation from companies</>
}
if(mults.crime_money_mult)
desc = <>{desc}<br />+{f(mults.crime_money_mult-1)} crime money</>
if(mults.crime_success_mult)
desc = <>{desc}<br />+{f(mults.crime_success_mult-1)} crime success rate</>
if(mults.work_money_mult)
desc = <>{desc}<br />+{f(mults.work_money_mult-1)} work money</>
if(mults.hacknet_node_money_mult)
desc = <>{desc}<br />+{f(mults.hacknet_node_money_mult-1)} hacknet production</>
if(mults.hacknet_node_purchase_cost_mult)
desc = <>{desc}<br />-{f(-(mults.hacknet_node_purchase_cost_mult-1))} hacknet nodes cost</>
if(mults.hacknet_node_level_cost_mult)
desc = <>{desc}<br />-{f(-(mults.hacknet_node_level_cost_mult-1))} hacknet nodes upgrade cost</>
if(mults.bladeburner_max_stamina_mult)
desc = <>{desc}<br />+{f(mults.bladeburner_max_stamina_mult-1)} Bladeburner Max Stamina</>
if(mults.bladeburner_stamina_gain_mult)
desc = <>{desc}<br />+{f(mults.bladeburner_stamina_gain_mult-1)} Bladeburner Stamina gain</>
if(mults.bladeburner_analysis_mult)
desc = <>{desc}<br />+{f(mults.bladeburner_analysis_mult-1)} Bladeburner Field Analysis effectiveness</>
if(mults.bladeburner_success_chance_mult)
desc = <>{desc}<br />+{f(mults.bladeburner_success_chance_mult-1)} Bladeburner Contracts and Operations success chance</>
if(startingMoney)
desc = <>{desc}<br />Start with {Money(startingMoney)} after installing Augmentations.</>
if(programs)
desc = <>{desc}<br />Start with {programs.join(' and ')} after installing Augmentations.</>
return desc;
} }
export class Augmentation { export class Augmentation {
@ -58,6 +185,9 @@ export class Augmentation {
// Description of what this Aug is and what it does // Description of what this Aug is and what it does
info: string | JSX.Element; info: string | JSX.Element;
// Description of the stats, often autogenerated, sometimes manually written.
stats: JSX.Element;
// Any Augmentation not immediately available in BitNode-1 is special (e.g. Bladeburner augs) // Any Augmentation not immediately available in BitNode-1 is special (e.g. Bladeburner augs)
isSpecial = false; isSpecial = false;
@ -126,6 +256,11 @@ export class Augmentation {
if (params.bladeburner_stamina_gain_mult) { this.mults.bladeburner_stamina_gain_mult = params.bladeburner_stamina_gain_mult; } if (params.bladeburner_stamina_gain_mult) { this.mults.bladeburner_stamina_gain_mult = params.bladeburner_stamina_gain_mult; }
if (params.bladeburner_analysis_mult) { this.mults.bladeburner_analysis_mult = params.bladeburner_analysis_mult; } if (params.bladeburner_analysis_mult) { this.mults.bladeburner_analysis_mult = params.bladeburner_analysis_mult; }
if (params.bladeburner_success_chance_mult) { this.mults.bladeburner_success_chance_mult = params.bladeburner_success_chance_mult; } if (params.bladeburner_success_chance_mult) { this.mults.bladeburner_success_chance_mult = params.bladeburner_success_chance_mult; }
if(params.stats)
this.stats = params.stats;
else
this.stats = generateStatsDescription(this.mults, params.programs, params.startingMoney);
} }
// Adds this Augmentation to the specified Factions // Adds this Augmentation to the specified Factions

File diff suppressed because it is too large Load Diff

@ -47,6 +47,7 @@ export const AugmentationNames: IMap<string> = {
PCDNI: "PC Direct-Neural Interface", PCDNI: "PC Direct-Neural Interface",
PCDNIOptimizer: "PC Direct-Neural Interface Optimization Submodule", PCDNIOptimizer: "PC Direct-Neural Interface Optimization Submodule",
PCDNINeuralNetwork: "PC Direct-Neural Interface NeuroNet Injector", PCDNINeuralNetwork: "PC Direct-Neural Interface NeuroNet Injector",
PCMatrix: "PCMatrix",
ADRPheromone1: "ADR-V1 Pheromone Gene", ADRPheromone1: "ADR-V1 Pheromone Gene",
ADRPheromone2: "ADR-V2 Pheromone Gene", ADRPheromone2: "ADR-V2 Pheromone Gene",
ShadowsSimulacrum: "The Shadow's Simulacrum", ShadowsSimulacrum: "The Shadow's Simulacrum",

@ -231,7 +231,11 @@ BitNodes["BitNode11"] = new BitNode(11, "The Big Crash", "Okay. Sell it all.",
"This Source-File also increases the player's company salary and reputation gain multipliers by:<br><br>" + "This Source-File also increases the player's company salary and reputation gain multipliers by:<br><br>" +
"Level 1: 32%<br>" + "Level 1: 32%<br>" +
"Level 2: 48%<br>" + "Level 2: 48%<br>" +
"Level 3: 56%"); "Level 3: 56%<br><br>" +
"It also reduces the price increase for every aug bought by:<br><br>"+
"Level 1: 4%<br>"+
"Level 2: 6%<br>"+
"Level 3: 7%");
BitNodes["BitNode12"] = new BitNode(12, "The Recursion", "Repeat.", BitNodes["BitNode12"] = new BitNode(12, "The Recursion", "Repeat.",
"To iterate is human, to recurse divine.<br><br>" + "To iterate is human, to recurse divine.<br><br>" +
"Every time this BitNode is destroyed, it becomes slightly harder. Destroying this BitNode will give you Source-File 12, or " + "Every time this BitNode is destroyed, it becomes slightly harder. Destroying this BitNode will give you Source-File 12, or " +

@ -6,7 +6,7 @@
import { IMap } from "./types"; import { IMap } from "./types";
export const CONSTANTS: IMap<any> = { export const CONSTANTS: IMap<any> = {
Version: "0.52.1", Version: "0.52.2",
/** 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
@ -225,24 +225,18 @@ export const CONSTANTS: IMap<any> = {
TotalNumBitNodes: 24, TotalNumBitNodes: 24,
LatestUpdate: ` LatestUpdate: `
v0.52.1 - 2021-07-10 bugfixing (hydroflame & community) v0.52.2 - 2021-07-15 Oh yeah, BN11 is a thing (drunk hydroflame tbh)
------------------------------------------- -------------------------------------------
**Misc.** ** Source-Files **
* Fix game crash/corruption when quitting a job while working for it unfocused. * Source-File 11 now also provides a small reduction to the price increase
* Fix typo in corporation Market Data. multiplier.
* Fix typo in docs for hackPercent.
* The tutorial encourages the players to connect to home before creating 'n00dles.script' ** Augmentations **
* The dark web 'buy' command now accepts '-1' (one) and '--list' instead of just
'-l'. Helps some confused players. * New Augmentation offered by Aevum, themed around 777 and offers some basic
* Character overview screen no longer hidden on the corporation screen. programs.
* Infiltration difficulty display is now more explicit (It's a big arrow instead * Augmentation descriptions are now more concise and consistent.
of just one word.)
* Fix wrong ram value in tutorial. (@MageKing17)
* Plenty of augmentation description cleanup (@Kwazygloo)
* Plenty of typo/description fixed (@MageKing17)
* Cleanup description of singularity function on readthedocs (@PurePandemonium)
* Fix bug when autolinking a server while backdooring (@schroederIT)
`, `,
} }

@ -76,6 +76,7 @@ class DevMenuComponent extends Component {
this.setSF = this.setSF.bind(this); this.setSF = this.setSF.bind(this);
this.setAllSF = this.setAllSF.bind(this); this.setAllSF = this.setAllSF.bind(this);
this.clearExploits = this.clearExploits.bind(this);
this.processStocks = this.processStocks.bind(this); this.processStocks = this.processStocks.bind(this);
this.setStockPrice = this.setStockPrice.bind(this); this.setStockPrice = this.setStockPrice.bind(this);
this.viewStockCaps = this.viewStockCaps.bind(this); this.viewStockCaps = this.viewStockCaps.bind(this);
@ -378,6 +379,10 @@ class DevMenuComponent extends Component {
} }
} }
clearExploits() {
Player.exploits = [];
}
addProgram() { addProgram() {
const program = this.state.program; const program = this.state.program;
if(!Player.hasProgram(program)) { if(!Player.hasProgram(program)) {
@ -953,6 +958,12 @@ class DevMenuComponent extends Component {
</div> </div>
<table> <table>
<tbody> <tbody>
<tr>
<td><span className="text">Exploits:</span></td>
<td>
<button className="std-button touch-right" onClick={this.clearExploits()}>Clear</button>
</td>
</tr>
<tr key={'sf-all'}> <tr key={'sf-all'}>
<td><span className="text">All:</span></td> <td><span className="text">All:</span></td>
<td> <td>

@ -20,6 +20,7 @@ import {
getFactionSecurityWorkRepGain, getFactionSecurityWorkRepGain,
getFactionFieldWorkRepGain, getFactionFieldWorkRepGain,
} from "../PersonObjects/formulas/reputation"; } from "../PersonObjects/formulas/reputation";
import { SourceFileFlags } from "../SourceFile/SourceFileFlags";
import { Page, routing } from "../ui/navigationTracking"; import { Page, routing } from "../ui/navigationTracking";
import { dialogBoxCreate } from "../../utils/DialogBox"; import { dialogBoxCreate } from "../../utils/DialogBox";
@ -194,13 +195,13 @@ export function purchaseAugmentation(aug, fac, sing=false) {
aug.baseCost = 750e3 * mult * BitNodeMultipliers.AugmentationMoneyCost; aug.baseCost = 750e3 * mult * BitNodeMultipliers.AugmentationMoneyCost;
for (var i = 0; i < Player.queuedAugmentations.length-1; ++i) { for (var i = 0; i < Player.queuedAugmentations.length-1; ++i) {
aug.baseCost *= CONSTANTS.MultipleAugMultiplier; aug.baseCost *= (CONSTANTS.MultipleAugMultiplier * [1, 0.96, 0.94, 0.93][SourceFileFlags[11]]);
} }
} }
for (var name in Augmentations) { for (var name in Augmentations) {
if (Augmentations.hasOwnProperty(name)) { if (Augmentations.hasOwnProperty(name)) {
Augmentations[name].baseCost *= CONSTANTS.MultipleAugMultiplier; Augmentations[name].baseCost *= (CONSTANTS.MultipleAugMultiplier * [1, 0.96, 0.94, 0.93][SourceFileFlags[11]]);
} }
} }

@ -137,6 +137,12 @@ export class PurchaseableAugmentation extends React.Component<IProps, any> {
btnTxt += ` - Level ${getNextNeurofluxLevel()}`; btnTxt += ` - Level ${getNextNeurofluxLevel()}`;
} }
let tooltip = <></>;
if(typeof this.aug.info === "string")
tooltip = <><span dangerouslySetInnerHTML={{__html: this.aug.info}} /><br /><br />{this.aug.stats}</>
else
tooltip = <>{this.aug.info}<br /><br />{this.aug.stats}</>
return ( return (
<li> <li>
<span style={spanStyleMarkup}> <span style={spanStyleMarkup}>
@ -145,7 +151,7 @@ export class PurchaseableAugmentation extends React.Component<IProps, any> {
onClick={this.handleClick} onClick={this.handleClick}
style={inlineStyleMarkup} style={inlineStyleMarkup}
text={btnTxt} text={btnTxt}
tooltip={this.aug.info} tooltip={tooltip}
/> />
<p style={txtStyle}>{status}</p> <p style={txtStyle}>{status}</p>
</span> </span>

@ -59,6 +59,8 @@ export function createSleevePurchaseAugsPopup(sleeve: Sleeve, p: IPlayer): void
if(typeof tooltip !== 'string') { if(typeof tooltip !== 'string') {
tooltip = renderToStaticMarkup(tooltip); tooltip = renderToStaticMarkup(tooltip);
} }
tooltip += "<br /><br />";
tooltip += renderToStaticMarkup(aug.stats);
ownedAugsDiv.appendChild(createElement("div", { ownedAugsDiv.appendChild(createElement("div", {
class: "gang-owned-upgrade", // Reusing a class from the Gang UI class: "gang-owned-upgrade", // Reusing a class from the Gang UI
@ -92,6 +94,8 @@ export function createSleevePurchaseAugsPopup(sleeve: Sleeve, p: IPlayer): void
if(typeof info !== 'string') { if(typeof info !== 'string') {
info = renderToStaticMarkup(info); info = renderToStaticMarkup(info);
} }
info += "<br /><br />";
info += renderToStaticMarkup(aug.stats);
div.appendChild(createElement("p", { div.appendChild(createElement("p", {
fontSize: "12px", fontSize: "12px",

@ -97,6 +97,11 @@ function prestigeAugmentation() {
Player.setMoney(1e6); Player.setMoney(1e6);
homeComp.programs.push(Programs.BruteSSHProgram.name); homeComp.programs.push(Programs.BruteSSHProgram.name);
} }
if (augmentationExists(AugmentationNames.PCMatrix) &&
Augmentations[AugmentationNames.PCMatrix].owned) {
homeComp.programs.push(Programs.DeepscanV1.name);
homeComp.programs.push(Programs.AutoLink.name);
}
// Re-create foreign servers // Re-create foreign servers
initForeignServers(Player.getHomeComputer()); initForeignServers(Player.getHomeComputer());

@ -60,5 +60,9 @@ SourceFiles["SourceFile11"] = new SourceFile(11, "This Source-File makes it so t
" increases the player's company salary and reputation gain multipliers by:<br><br>" + " increases the player's company salary and reputation gain multipliers by:<br><br>" +
"Level 1: 32%<br>" + "Level 1: 32%<br>" +
"Level 2: 48%<br>" + "Level 2: 48%<br>" +
"Level 3: 56%<br>"); "Level 3: 56%<br><br>" +
"It also reduces the price increase for every aug bought by:<br><br>"+
"Level 1: 4%<br>"+
"Level 2: 6%<br>"+
"Level 3: 7%");
SourceFiles["SourceFile12"] = new SourceFile(12, "This Source-File lets the player start with Neuroflux Governor equal to the level of this Source-File."); SourceFiles["SourceFile12"] = new SourceFile(12, "This Source-File lets the player start with Neuroflux Governor equal to the level of this Source-File.");

@ -1082,12 +1082,13 @@ const Engine = {
initBitNodeMultipliers(Player); initBitNodeMultipliers(Player);
Engine.setDisplayElements(); // Sets variables for important DOM elements Engine.setDisplayElements(); // Sets variables for important DOM elements
Engine.init(); // Initialize buttons, work, etc. Engine.init(); // Initialize buttons, work, etc.
updateSourceFileFlags(Player);
initAugmentations(); // Also calls Player.reapplyAllAugmentations() initAugmentations(); // Also calls Player.reapplyAllAugmentations()
Player.reapplyAllSourceFiles(); Player.reapplyAllSourceFiles();
if (Player.hasWseAccount) { if (Player.hasWseAccount) {
initSymbolToStockMap(); initSymbolToStockMap();
} }
updateSourceFileFlags(Player);
// Calculate the number of cycles have elapsed while offline // Calculate the number of cycles have elapsed while offline
Engine._lastUpdate = new Date().getTime(); Engine._lastUpdate = new Date().getTime();

@ -28,7 +28,7 @@ export function AugmentationAccordion(props: IProps): React.ReactElement {
return ( return (
<Accordion <Accordion
headerContent={<>{displayName}</>} headerContent={<>{displayName}</>}
panelContent={<p dangerouslySetInnerHTML={{__html: props.aug.info}}></p>} panelContent={<p><span dangerouslySetInnerHTML={{__html: props.aug.info}} /><br /><br />{props.aug.stats}</p>}
/> />
) )
} }
@ -36,7 +36,7 @@ export function AugmentationAccordion(props: IProps): React.ReactElement {
return ( return (
<Accordion <Accordion
headerContent={<>{displayName}</>} headerContent={<>{displayName}</>}
panelContent={<p>{props.aug.info}</p>} panelContent={<p>{props.aug.info}<br /><br />{props.aug.stats}</p>}
/> />
) )
} }