Character,Augmentations now display by how much the stats will increase.

This commit is contained in:
Olivier Gagnon 2021-03-07 16:32:16 -05:00
parent 6cd6f28820
commit 79a06dd91c
10 changed files with 125 additions and 110 deletions

@ -59,10 +59,16 @@
} }
#character-hp-wrapper { color: $my-stat-hp-color; } #character-hp-wrapper { color: $my-stat-hp-color; }
.character-hp-cell { color: $my-stat-hp-color; }
#character-money-wrapper { color: $my-stat-money-color; } #character-money-wrapper { color: $my-stat-money-color; }
.character-money-cell { color: $my-stat-money-color; }
#character-hack-wrapper { color: $my-stat-hack-color; } #character-hack-wrapper { color: $my-stat-hack-color; }
.character-hack-cell { color: $my-stat-hack-color; }
#character-cha-wrapper { color: $my-stat-cha-color; } #character-cha-wrapper { color: $my-stat-cha-color; }
.character-cha-cell { color: $my-stat-cha-color; }
#character-int-wrapper { color: $my-stat-int-color; } #character-int-wrapper { color: $my-stat-int-color; }
.character-int-cell { color: $my-stat-int-color; }
.character-combat-cell { color: $my-stat-physical; }
.character-overview-btn { .character-overview-btn {
@include borderRadius(12px); @include borderRadius(12px);

@ -17,7 +17,8 @@ body {
p, p,
pre, pre,
h2, h2,
.text { .text,
td {
color: var(--my-font-color); color: var(--my-font-color);
} }

@ -5,92 +5,104 @@ import * as React from "react";
import { Player } from "../../Player"; import { Player } from "../../Player";
import { numeralWrapper } from "../../ui/numeralFormat"; import { numeralWrapper } from "../../ui/numeralFormat";
import { Augmentations} from "../Augmentations";
function calculateAugmentedStats() {
const augP: any = {};
for(const aug of Player.queuedAugmentations) {
const augObj = Augmentations[aug.name];
for (const mult in augObj.mults) {
const v = augP[mult] ? augP[mult] : 1;
augP[mult] = v * augObj.mults[mult];
}
}
return augP;
}
export function PlayerMultipliers(): React.ReactElement { export function PlayerMultipliers(): React.ReactElement {
const mults = calculateAugmentedStats();
function MultiplierTable(rows: any[]): React.ReactElement {
function improvements(r: number) {
let elems: any[] = [];
if(r) {
elems = [
<td key='2'>&nbsp;=>&nbsp;</td>,
<td key='3'>{numeralWrapper.formatPercentage(r)}</td>
];
}
return elems;
}
return <table>
<tbody>
{rows.map((r: any) => <tr key={r[0]}>
<td key='0'><span>{r[0]} multiplier:&nbsp;</span></td>
<td key='1' style={{textAlign: 'right'}}>{numeralWrapper.formatPercentage(r[1])}</td>
{improvements(r[2])}
</tr>)}
</tbody>
</table>
}
return ( return (
<> <>
<p><strong><u>Total Multipliers:</u></strong></p> <p><strong><u>Multipliers:</u></strong></p><br />
{MultiplierTable([
['Hacking Chance ', Player.hacking_chance_mult, Player.hacking_chance_mult*mults.hacking_chance_mult],
['Hacking Speed ', Player.hacking_speed_mult, Player.hacking_speed_mult*mults.hacking_speed_mult],
['Hacking Money ', Player.hacking_money_mult, Player.hacking_money_mult*mults.hacking_money_mult],
['Hacking Growth ', Player.hacking_grow_mult, Player.hacking_grow_mult*mults.hacking_grow_mult]
])}<br />
<pre> {MultiplierTable([
{'Hacking Chance multiplier: ' + numeralWrapper.formatPercentage(Player.hacking_chance_mult)} ['Hacking Level ', Player.hacking_mult, Player.hacking_mult*mults.hacking_mult],
</pre> ['Hacking Experience ', Player.hacking_exp_mult, Player.hacking_exp_mult*mults.hacking_exp_mult]
<pre> ])}<br />
{'Hacking Speed multiplier: ' + numeralWrapper.formatPercentage(Player.hacking_speed_mult)}
</pre>
<pre> {MultiplierTable([
{'Hacking Money multiplier: ' + numeralWrapper.formatPercentage(Player.hacking_money_mult)} ['Strength Level ', Player.strength_mult, Player.strength_mult*mults.strength_mult],
</pre> ['Strength Experience ', Player.strength_exp_mult, Player.strength_exp_mult*mults.strength_exp_mult]
<pre> ])}<br />
{'Hacking Growth multiplier: ' + numeralWrapper.formatPercentage(Player.hacking_grow_mult)}
</pre><br /> {MultiplierTable([
<pre> ['Defense Level ', Player.defense_mult, Player.defense_mult*mults.defense_mult],
{'Hacking Level multiplier: ' + numeralWrapper.formatPercentage(Player.hacking_mult)} ['Defense Experience ', Player.defense_exp_mult, Player.defense_exp_mult*mults.defense_exp_mult]
</pre> ])}<br />
<pre>
{'Hacking Experience multiplier: ' + numeralWrapper.formatPercentage(Player.hacking_exp_mult)} {MultiplierTable([
</pre> ['Dexterity Level ', Player.dexterity_mult, Player.dexterity_mult*mults.dexterity_mult],
<br /> ['Dexterity Experience ', Player.dexterity_exp_mult, Player.dexterity_exp_mult*mults.dexterity_exp_mult]
<pre> ])}<br />
{'Strength Level multiplier: ' + numeralWrapper.formatPercentage(Player.strength_mult)}
</pre> {MultiplierTable([
<pre> ['Agility Level ', Player.agility_mult, Player.agility_mult*mults.agility_mult],
{'Strength Experience multiplier: ' + numeralWrapper.formatPercentage(Player.strength_exp_mult)} ['Agility Experience ', Player.agility_exp_mult, Player.agility_exp_mult*mults.agility_exp_mult]
</pre> ])}<br />
<br />
<pre> {MultiplierTable([
{'Defense Level multiplier: ' + numeralWrapper.formatPercentage(Player.defense_mult)} ['Charisma Level ', Player.charisma_mult, Player.charisma_mult*mults.charisma_mult],
</pre> ['Charisma Experience ', Player.charisma_exp_mult, Player.charisma_exp_mult*mults.charisma_exp_mult]
<pre> ])}<br />
{'Defense Experience multiplier: ' + numeralWrapper.formatPercentage(Player.defense_exp_mult)}
</pre><br /> {MultiplierTable([
<pre> ['Hacknet Node production ', Player.hacknet_node_money_mult, Player.hacknet_node_money_mult*mults.hacknet_node_money_mult],
{'Dexterity Level multiplier: ' + numeralWrapper.formatPercentage(Player.dexterity_mult)} ['Hacknet Node purchase cost ', Player.hacknet_node_purchase_cost_mult, Player.hacknet_node_purchase_cost_mult*mults.hacknet_node_purchase_cost_mult],
</pre> ['Hacknet Node RAM upgrade cost ', Player.hacknet_node_ram_cost_mult, Player.hacknet_node_ram_cost_mult*mults.hacknet_node_ram_cost_mult],
<pre> ['Hacknet Node Core purchase cost ', Player.hacknet_node_core_cost_mult, Player.hacknet_node_core_cost_mult*mults.hacknet_node_core_cost_mult],
{'Dexterity Experience multiplier: ' + numeralWrapper.formatPercentage(Player.dexterity_exp_mult)} ['Hacknet Node level upgrade cost ', Player.hacknet_node_level_cost_mult, Player.hacknet_node_level_cost_mult*mults.hacknet_node_level_cost_mult]
</pre><br /> ])}<br />
<pre>
{'Agility Level multiplier: ' + numeralWrapper.formatPercentage(Player.agility_mult)} {MultiplierTable([
</pre> ['Company reputation gain ', Player.company_rep_mult, Player.company_rep_mult*mults.company_rep_mult],
<pre> ['Faction reputation gain ', Player.faction_rep_mult, Player.faction_rep_mult*mults.faction_rep_mult],
{'Agility Experience multiplier: ' + numeralWrapper.formatPercentage(Player.agility_exp_mult)} ['Salary ', Player.work_money_mult, Player.work_money_mult*mults.work_money_mult]
</pre><br /> ])}<br />
<pre>
{'Charisma Level multiplier: ' + numeralWrapper.formatPercentage(Player.charisma_mult)} {MultiplierTable([
</pre> ['Crime success ', Player.crime_success_mult, Player.crime_success_mult*mults.crime_success_mult],
<pre> ['Crime money ', Player.crime_money_mult, Player.crime_money_mult*mults.crime_money_mult],
{'Charisma Experience multiplier: ' + numeralWrapper.formatPercentage(Player.charisma_exp_mult)} ])}<br />
</pre><br />
<pre>
{'Hacknet Node production multiplier: ' + numeralWrapper.formatPercentage(Player.hacknet_node_money_mult)}
</pre>
<pre>
{'Hacknet Node purchase cost multiplier: ' + numeralWrapper.formatPercentage(Player.hacknet_node_purchase_cost_mult)}
</pre>
<pre>
{'Hacknet Node RAM upgrade cost multiplier: ' + numeralWrapper.formatPercentage(Player.hacknet_node_ram_cost_mult)}
</pre>
<pre>
{'Hacknet Node Core purchase cost multiplier: ' + numeralWrapper.formatPercentage(Player.hacknet_node_core_cost_mult)}
</pre>
<pre>
{'Hacknet Node level upgrade cost multiplier: ' + numeralWrapper.formatPercentage(Player.hacknet_node_level_cost_mult)}
</pre><br />
<pre>
{'Company reputation gain multiplier: ' + numeralWrapper.formatPercentage(Player.company_rep_mult)}
</pre>
<pre>
{'Faction reputation gain multiplier: ' + numeralWrapper.formatPercentage(Player.faction_rep_mult)}
</pre>
<pre>
{'Salary multiplier: ' + numeralWrapper.formatPercentage(Player.work_money_mult)}
</pre><br />
<pre>
{'Crime success multiplier: ' + numeralWrapper.formatPercentage(Player.crime_success_mult)}
</pre>
<pre>
{'Crime money multiplier: ' + numeralWrapper.formatPercentage(Player.crime_money_mult)}
</pre>
</> </>
) )
} }

@ -74,7 +74,6 @@ for (const md of codingContractTypesMetadata) {
// tslint:disable-next-line // tslint:disable-next-line
CodingContractTypes[md.name] = new CodingContractType(md.name, md.desc, md.gen, md.solver, md.difficulty, md.numTries); CodingContractTypes[md.name] = new CodingContractType(md.name, md.desc, md.gen, md.solver, md.difficulty, md.numTries);
} }
console.info(`${Object.keys(CodingContractTypes).length} Coding Contract Types loaded`);
/** /**
* Enum representing the different types of rewards a Coding Contract can give * Enum representing the different types of rewards a Coding Contract can give

@ -258,5 +258,7 @@ export let CONSTANTS: IMap<any> = {
* BN12 now reduces contract money * BN12 now reduces contract money
* Character>Stats percentages are aligned, server and hacknet limit are * Character>Stats percentages are aligned, server and hacknet limit are
displayed, if the player has SF5 the reduces stats are shown. displayed, if the player has SF5 the reduces stats are shown.
* Character>Augmentations now displays by how much the player stats will
increase.
` `
} }

@ -500,7 +500,6 @@ export function createAndAddWorkerScript(runningScriptObj, server) {
// the script from being cleaned up twice // the script from being cleaned up twice
if (!w.running) { return; } if (!w.running) { return; }
console.log("Stopping script " + w.name + " because it finished running naturally");
killWorkerScript(s); killWorkerScript(s);
w.log("Script finished running"); w.log("Script finished running");
}).catch(function(w) { }).catch(function(w) {
@ -512,8 +511,8 @@ export function createAndAddWorkerScript(runningScriptObj, server) {
if (isScriptErrorMessage(w.errorMessage)) { if (isScriptErrorMessage(w.errorMessage)) {
var errorTextArray = w.errorMessage.split("|"); var errorTextArray = w.errorMessage.split("|");
if (errorTextArray.length != 4) { if (errorTextArray.length != 4) {
console.log("ERROR: Something wrong with Error text in evaluator..."); console.error("ERROR: Something wrong with Error text in evaluator...");
console.log("Error text: " + errorText); console.error("Error text: " + errorText);
return; return;
} }
var serverIp = errorTextArray[1]; var serverIp = errorTextArray[1];
@ -532,11 +531,11 @@ export function createAndAddWorkerScript(runningScriptObj, server) {
w.env.stopFlag = true; w.env.stopFlag = true;
} else if (isScriptErrorMessage(w)) { } else if (isScriptErrorMessage(w)) {
dialogBoxCreate("Script runtime unknown error. This is a bug please contact game developer"); dialogBoxCreate("Script runtime unknown error. This is a bug please contact game developer");
console.log("ERROR: Evaluating workerscript returns only error message rather than WorkerScript object. THIS SHOULDN'T HAPPEN: " + w.toString()); console.error("ERROR: Evaluating workerscript returns only error message rather than WorkerScript object. THIS SHOULDN'T HAPPEN: " + w.toString());
return; return;
} else { } else {
dialogBoxCreate("An unknown script died for an unknown reason. This is a bug please contact game dev"); dialogBoxCreate("An unknown script died for an unknown reason. This is a bug please contact game dev");
console.log(w); console.error(w);
} }
killWorkerScript(s); killWorkerScript(s);

@ -411,7 +411,7 @@ export function recordMoneySource(amt, source) {
export function gainHackingExp(exp) { export function gainHackingExp(exp) {
if (isNaN(exp)) { if (isNaN(exp)) {
console.log("ERR: NaN passed into Player.gainHackingExp()"); return; console.error("ERR: NaN passed into Player.gainHackingExp()"); return;
} }
this.hacking_exp += exp; this.hacking_exp += exp;
if(this.hacking_exp < 0) { if(this.hacking_exp < 0) {
@ -421,7 +421,7 @@ export function gainHackingExp(exp) {
export function gainStrengthExp(exp) { export function gainStrengthExp(exp) {
if (isNaN(exp)) { if (isNaN(exp)) {
console.log("ERR: NaN passed into Player.gainStrengthExp()"); return; console.error("ERR: NaN passed into Player.gainStrengthExp()"); return;
} }
this.strength_exp += exp; this.strength_exp += exp;
if(this.strength_exp < 0) { if(this.strength_exp < 0) {
@ -431,7 +431,7 @@ export function gainStrengthExp(exp) {
export function gainDefenseExp(exp) { export function gainDefenseExp(exp) {
if (isNaN(exp)) { if (isNaN(exp)) {
console.log("ERR: NaN passed into player.gainDefenseExp()"); return; console.error("ERR: NaN passed into player.gainDefenseExp()"); return;
} }
this.defense_exp += exp; this.defense_exp += exp;
if(this.defense_exp < 0) { if(this.defense_exp < 0) {
@ -441,7 +441,7 @@ export function gainDefenseExp(exp) {
export function gainDexterityExp(exp) { export function gainDexterityExp(exp) {
if (isNaN(exp)) { if (isNaN(exp)) {
console.log("ERR: NaN passed into Player.gainDexterityExp()"); return; console.error("ERR: NaN passed into Player.gainDexterityExp()"); return;
} }
this.dexterity_exp += exp; this.dexterity_exp += exp;
if(this.dexterity_exp < 0) { if(this.dexterity_exp < 0) {
@ -451,7 +451,7 @@ export function gainDexterityExp(exp) {
export function gainAgilityExp(exp) { export function gainAgilityExp(exp) {
if (isNaN(exp)) { if (isNaN(exp)) {
console.log("ERR: NaN passed into Player.gainAgilityExp()"); return; console.error("ERR: NaN passed into Player.gainAgilityExp()"); return;
} }
this.agility_exp += exp; this.agility_exp += exp;
if(this.agility_exp < 0) { if(this.agility_exp < 0) {
@ -461,7 +461,7 @@ export function gainAgilityExp(exp) {
export function gainCharismaExp(exp) { export function gainCharismaExp(exp) {
if (isNaN(exp)) { if (isNaN(exp)) {
console.log("ERR: NaN passed into Player.gainCharismaExp()"); return; console.error("ERR: NaN passed into Player.gainCharismaExp()"); return;
} }
this.charisma_exp += exp; this.charisma_exp += exp;
if(this.charisma_exp < 0) { if(this.charisma_exp < 0) {
@ -471,7 +471,7 @@ export function gainCharismaExp(exp) {
export function gainIntelligenceExp(exp) { export function gainIntelligenceExp(exp) {
if (isNaN(exp)) { if (isNaN(exp)) {
console.log("ERROR: NaN passed into Player.gainIntelligenceExp()"); return; console.error("ERROR: NaN passed into Player.gainIntelligenceExp()"); return;
} }
if (SourceFileFlags[5] > 0 || this.intelligence > 0) { if (SourceFileFlags[5] > 0 || this.intelligence > 0) {
this.intelligence_exp += exp; this.intelligence_exp += exp;
@ -1827,7 +1827,6 @@ export function isQualified(company, position) {
/********** Reapplying Augmentations and Source File ***********/ /********** Reapplying Augmentations and Source File ***********/
export function reapplyAllAugmentations(resetMultipliers=true) { export function reapplyAllAugmentations(resetMultipliers=true) {
console.log("Re-applying augmentations");
if (resetMultipliers) { if (resetMultipliers) {
this.resetMultipliers(); this.resetMultipliers();
} }
@ -1856,7 +1855,6 @@ export function reapplyAllAugmentations(resetMultipliers=true) {
} }
export function reapplyAllSourceFiles() { export function reapplyAllSourceFiles() {
console.log("Re-applying source files");
//Will always be called after reapplyAllAugmentations() so multipliers do not have to be reset //Will always be called after reapplyAllAugmentations() so multipliers do not have to be reset
//this.resetMultipliers(); //this.resetMultipliers();

@ -112,7 +112,7 @@ BitburnerSaveObject.prototype.saveGame = function(db) {
var request = objectStore.put(saveString, "save"); var request = objectStore.put(saveString, "save");
request.onerror = function(e) { request.onerror = function(e) {
console.log("Error saving game to IndexedDB: " + e); console.error("Error saving game to IndexedDB: " + e);
} }
request.onsuccess = function(e) { request.onsuccess = function(e) {
@ -124,7 +124,7 @@ BitburnerSaveObject.prototype.saveGame = function(db) {
} catch(e) { } catch(e) {
if (e.code == 22) { if (e.code == 22) {
createStatusText("Save failed for localStorage! Check console(F12)"); createStatusText("Save failed for localStorage! Check console(F12)");
console.log("Failed to save game to localStorage because the size of the save file " + console.error("Failed to save game to localStorage because the size of the save file " +
"is too large. However, the game will still be saved to IndexedDb if your browser " + "is too large. However, the game will still be saved to IndexedDb if your browser " +
"supports it. If you would like to save to localStorage as well, then " + "supports it. If you would like to save to localStorage as well, then " +
"consider killing several of your scripts to " + "consider killing several of your scripts to " +
@ -247,7 +247,7 @@ function loadGame(saveString) {
try { try {
Settings.load(saveObj.SettingsSave); Settings.load(saveObj.SettingsSave);
} catch(e) { } catch(e) {
console.log("ERROR: Failed to parse Settings. Re-initing default values"); console.error("ERROR: Failed to parse Settings. Re-initing default values");
Settings.init(); Settings.init();
} }
} else { } else {
@ -257,7 +257,7 @@ function loadGame(saveString) {
try { try {
loadFconf(saveObj.FconfSettingsSave); loadFconf(saveObj.FconfSettingsSave);
} catch(e) { } catch(e) {
console.log("ERROR: Failed to parse .fconf Settings."); console.error("ERROR: Failed to parse .fconf Settings.");
} }
} }
if (saveObj.hasOwnProperty("VersionSave")) { if (saveObj.hasOwnProperty("VersionSave")) {
@ -281,7 +281,7 @@ function loadGame(saveString) {
try { try {
loadAllGangs(saveObj.AllGangsSave); loadAllGangs(saveObj.AllGangsSave);
} catch(e) { } catch(e) {
console.log("ERROR: Failed to parse AllGangsSave: " + e); console.error("ERROR: Failed to parse AllGangsSave: " + e);
} }
} }
@ -439,7 +439,7 @@ function loadImportedGame(saveObj, saveString) {
try { try {
loadFconf(saveObj.FconfSettingsSave); loadFconf(saveObj.FconfSettingsSave);
} catch(e) { } catch(e) {
console.log("ERROR: Failed to load .fconf settings when importing"); console.error("ERROR: Failed to load .fconf settings when importing");
} }
} }
if (saveObj.hasOwnProperty("VersionSave")) { if (saveObj.hasOwnProperty("VersionSave")) {
@ -460,7 +460,7 @@ function loadImportedGame(saveObj, saveString) {
try { try {
loadAllGangs(saveObj.AllGangsSave); loadAllGangs(saveObj.AllGangsSave);
} catch(e) { } catch(e) {
console.log("ERROR: Failed to parse AllGangsSave: " + e); console.error("ERROR: Failed to parse AllGangsSave: " + e);
} }
} }

@ -592,7 +592,7 @@ const Engine = {
factionsList.appendChild(createElement("a", { factionsList.appendChild(createElement("a", {
class:"a-link-button", innerText:factionName, padding:"4px", margin:"4px", class:"a-link-button", innerText:factionName, padding:"4px", margin:"4px",
display:"inline-block", display:"inline-block",
clickListener:()=>{ clickListener: () => {
Engine.loadFactionContent(); Engine.loadFactionContent();
displayFactionContent(factionName); displayFactionContent(factionName);
return false; return false;
@ -1536,19 +1536,18 @@ window.onload = function() {
indexedDbRequest = window.indexedDB.open("bitburnerSave", 1); indexedDbRequest = window.indexedDB.open("bitburnerSave", 1);
indexedDbRequest.onerror = function(e) { indexedDbRequest.onerror = function(e) {
console.log("Error opening indexedDB: "); console.error("Error opening indexedDB: ");
console.log(e); console.error(e);
return Engine.load(null); // Try to load from localstorage return Engine.load(null); // Try to load from localstorage
}; };
indexedDbRequest.onsuccess = function(e) { indexedDbRequest.onsuccess = function(e) {
console.log("Opening bitburnerSave database successful!");
indexedDb = e.target.result; indexedDb = e.target.result;
var transaction = indexedDb.transaction(["savestring"]); var transaction = indexedDb.transaction(["savestring"]);
var objectStore = transaction.objectStore("savestring"); var objectStore = transaction.objectStore("savestring");
var request = objectStore.get("save"); var request = objectStore.get("save");
request.onerror = function(e) { request.onerror = function(e) {
console.log("Error in Database request to get savestring: " + e); console.error("Error in Database request to get savestring: " + e);
return Engine.load(null); // Try to load from localstorage return Engine.load(null); // Try to load from localstorage
} }

@ -42,7 +42,6 @@ document.addEventListener("keydown", function (event) {
let dialogBoxOpened = false; let dialogBoxOpened = false;
function dialogBoxCreate(txt, preformatted=false) { function dialogBoxCreate(txt, preformatted=false) {
console.log(`dialogBoxCreate() called`)
var container = document.createElement("div"); var container = document.createElement("div");
container.setAttribute("class", "dialog-box-container"); container.setAttribute("class", "dialog-box-container");