diff --git a/css/characteroverview.scss b/css/characteroverview.scss
index 2e0279be2..d23a8e587 100644
--- a/css/characteroverview.scss
+++ b/css/characteroverview.scss
@@ -59,10 +59,16 @@
}
#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-cell { color: $my-stat-money-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-cell { color: $my-stat-cha-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 {
@include borderRadius(12px);
diff --git a/css/styles.scss b/css/styles.scss
index febdf156a..1dc038218 100644
--- a/css/styles.scss
+++ b/css/styles.scss
@@ -17,7 +17,8 @@ body {
p,
pre,
h2,
-.text {
+.text,
+td {
color: var(--my-font-color);
}
diff --git a/src/Augmentation/ui/PlayerMultipliers.tsx b/src/Augmentation/ui/PlayerMultipliers.tsx
index f263558de..33df9c550 100644
--- a/src/Augmentation/ui/PlayerMultipliers.tsx
+++ b/src/Augmentation/ui/PlayerMultipliers.tsx
@@ -5,92 +5,104 @@ import * as React from "react";
import { Player } from "../../Player";
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 {
+ const mults = calculateAugmentedStats();
+ function MultiplierTable(rows: any[]): React.ReactElement {
+ function improvements(r: number) {
+ let elems: any[] = [];
+ if(r) {
+ elems = [
+
=> | ,
+ {numeralWrapper.formatPercentage(r)} |
+ ];
+ }
+ return elems;
+ }
+
+ return
+
+ {rows.map((r: any) =>
+ | {r[0]} multiplier: |
+ {numeralWrapper.formatPercentage(r[1])} |
+ {improvements(r[2])}
+
)}
+
+
+ }
+
return (
<>
- Total Multipliers:
+ Multipliers:
+ {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]
+ ])}
-
- {'Hacking Chance multiplier: ' + numeralWrapper.formatPercentage(Player.hacking_chance_mult)}
-
-
- {'Hacking Speed multiplier: ' + numeralWrapper.formatPercentage(Player.hacking_speed_mult)}
-
-
- {'Hacking Money multiplier: ' + numeralWrapper.formatPercentage(Player.hacking_money_mult)}
-
-
- {'Hacking Growth multiplier: ' + numeralWrapper.formatPercentage(Player.hacking_grow_mult)}
-
-
- {'Hacking Level multiplier: ' + numeralWrapper.formatPercentage(Player.hacking_mult)}
-
-
- {'Hacking Experience multiplier: ' + numeralWrapper.formatPercentage(Player.hacking_exp_mult)}
-
-
-
- {'Strength Level multiplier: ' + numeralWrapper.formatPercentage(Player.strength_mult)}
-
-
- {'Strength Experience multiplier: ' + numeralWrapper.formatPercentage(Player.strength_exp_mult)}
-
-
-
- {'Defense Level multiplier: ' + numeralWrapper.formatPercentage(Player.defense_mult)}
-
-
- {'Defense Experience multiplier: ' + numeralWrapper.formatPercentage(Player.defense_exp_mult)}
-
-
- {'Dexterity Level multiplier: ' + numeralWrapper.formatPercentage(Player.dexterity_mult)}
-
-
- {'Dexterity Experience multiplier: ' + numeralWrapper.formatPercentage(Player.dexterity_exp_mult)}
-
-
- {'Agility Level multiplier: ' + numeralWrapper.formatPercentage(Player.agility_mult)}
-
-
- {'Agility Experience multiplier: ' + numeralWrapper.formatPercentage(Player.agility_exp_mult)}
-
-
- {'Charisma Level multiplier: ' + numeralWrapper.formatPercentage(Player.charisma_mult)}
-
-
- {'Charisma Experience multiplier: ' + numeralWrapper.formatPercentage(Player.charisma_exp_mult)}
-
-
- {'Hacknet Node production multiplier: ' + numeralWrapper.formatPercentage(Player.hacknet_node_money_mult)}
-
-
- {'Hacknet Node purchase cost multiplier: ' + numeralWrapper.formatPercentage(Player.hacknet_node_purchase_cost_mult)}
-
-
- {'Hacknet Node RAM upgrade cost multiplier: ' + numeralWrapper.formatPercentage(Player.hacknet_node_ram_cost_mult)}
-
-
- {'Hacknet Node Core purchase cost multiplier: ' + numeralWrapper.formatPercentage(Player.hacknet_node_core_cost_mult)}
-
-
- {'Hacknet Node level upgrade cost multiplier: ' + numeralWrapper.formatPercentage(Player.hacknet_node_level_cost_mult)}
-
-
- {'Company reputation gain multiplier: ' + numeralWrapper.formatPercentage(Player.company_rep_mult)}
-
-
- {'Faction reputation gain multiplier: ' + numeralWrapper.formatPercentage(Player.faction_rep_mult)}
-
-
- {'Salary multiplier: ' + numeralWrapper.formatPercentage(Player.work_money_mult)}
-
-
- {'Crime success multiplier: ' + numeralWrapper.formatPercentage(Player.crime_success_mult)}
-
-
- {'Crime money multiplier: ' + numeralWrapper.formatPercentage(Player.crime_money_mult)}
-
+ {MultiplierTable([
+ ['Hacking Level ', Player.hacking_mult, Player.hacking_mult*mults.hacking_mult],
+ ['Hacking Experience ', Player.hacking_exp_mult, Player.hacking_exp_mult*mults.hacking_exp_mult]
+ ])}
+
+
+ {MultiplierTable([
+ ['Strength Level ', Player.strength_mult, Player.strength_mult*mults.strength_mult],
+ ['Strength Experience ', Player.strength_exp_mult, Player.strength_exp_mult*mults.strength_exp_mult]
+ ])}
+
+ {MultiplierTable([
+ ['Defense Level ', Player.defense_mult, Player.defense_mult*mults.defense_mult],
+ ['Defense Experience ', Player.defense_exp_mult, Player.defense_exp_mult*mults.defense_exp_mult]
+ ])}
+
+ {MultiplierTable([
+ ['Dexterity Level ', Player.dexterity_mult, Player.dexterity_mult*mults.dexterity_mult],
+ ['Dexterity Experience ', Player.dexterity_exp_mult, Player.dexterity_exp_mult*mults.dexterity_exp_mult]
+ ])}
+
+ {MultiplierTable([
+ ['Agility Level ', Player.agility_mult, Player.agility_mult*mults.agility_mult],
+ ['Agility Experience ', Player.agility_exp_mult, Player.agility_exp_mult*mults.agility_exp_mult]
+ ])}
+
+ {MultiplierTable([
+ ['Charisma Level ', Player.charisma_mult, Player.charisma_mult*mults.charisma_mult],
+ ['Charisma Experience ', Player.charisma_exp_mult, Player.charisma_exp_mult*mults.charisma_exp_mult]
+ ])}
+
+ {MultiplierTable([
+ ['Hacknet Node production ', Player.hacknet_node_money_mult, Player.hacknet_node_money_mult*mults.hacknet_node_money_mult],
+ ['Hacknet Node purchase cost ', Player.hacknet_node_purchase_cost_mult, Player.hacknet_node_purchase_cost_mult*mults.hacknet_node_purchase_cost_mult],
+ ['Hacknet Node RAM upgrade cost ', Player.hacknet_node_ram_cost_mult, Player.hacknet_node_ram_cost_mult*mults.hacknet_node_ram_cost_mult],
+ ['Hacknet Node Core purchase cost ', Player.hacknet_node_core_cost_mult, Player.hacknet_node_core_cost_mult*mults.hacknet_node_core_cost_mult],
+ ['Hacknet Node level upgrade cost ', Player.hacknet_node_level_cost_mult, Player.hacknet_node_level_cost_mult*mults.hacknet_node_level_cost_mult]
+ ])}
+
+ {MultiplierTable([
+ ['Company reputation gain ', Player.company_rep_mult, Player.company_rep_mult*mults.company_rep_mult],
+ ['Faction reputation gain ', Player.faction_rep_mult, Player.faction_rep_mult*mults.faction_rep_mult],
+ ['Salary ', Player.work_money_mult, Player.work_money_mult*mults.work_money_mult]
+ ])}
+
+ {MultiplierTable([
+ ['Crime success ', Player.crime_success_mult, Player.crime_success_mult*mults.crime_success_mult],
+ ['Crime money ', Player.crime_money_mult, Player.crime_money_mult*mults.crime_money_mult],
+ ])}
>
)
}
diff --git a/src/CodingContracts.ts b/src/CodingContracts.ts
index f571d6c04..2275ace56 100644
--- a/src/CodingContracts.ts
+++ b/src/CodingContracts.ts
@@ -74,7 +74,6 @@ for (const md of codingContractTypesMetadata) {
// tslint:disable-next-line
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
diff --git a/src/Constants.ts b/src/Constants.ts
index 116966f11..4b71fcd41 100644
--- a/src/Constants.ts
+++ b/src/Constants.ts
@@ -258,5 +258,7 @@ export let CONSTANTS: IMap = {
* BN12 now reduces contract money
* Character>Stats percentages are aligned, server and hacknet limit are
displayed, if the player has SF5 the reduces stats are shown.
+ * Character>Augmentations now displays by how much the player stats will
+ increase.
`
}
diff --git a/src/NetscriptWorker.js b/src/NetscriptWorker.js
index 32c6d8700..a07f92f32 100644
--- a/src/NetscriptWorker.js
+++ b/src/NetscriptWorker.js
@@ -500,7 +500,6 @@ export function createAndAddWorkerScript(runningScriptObj, server) {
// the script from being cleaned up twice
if (!w.running) { return; }
- console.log("Stopping script " + w.name + " because it finished running naturally");
killWorkerScript(s);
w.log("Script finished running");
}).catch(function(w) {
@@ -512,8 +511,8 @@ export function createAndAddWorkerScript(runningScriptObj, server) {
if (isScriptErrorMessage(w.errorMessage)) {
var errorTextArray = w.errorMessage.split("|");
if (errorTextArray.length != 4) {
- console.log("ERROR: Something wrong with Error text in evaluator...");
- console.log("Error text: " + errorText);
+ console.error("ERROR: Something wrong with Error text in evaluator...");
+ console.error("Error text: " + errorText);
return;
}
var serverIp = errorTextArray[1];
@@ -532,11 +531,11 @@ export function createAndAddWorkerScript(runningScriptObj, server) {
w.env.stopFlag = true;
} else if (isScriptErrorMessage(w)) {
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;
} else {
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);
diff --git a/src/PersonObjects/Player/PlayerObjectGeneralMethods.js b/src/PersonObjects/Player/PlayerObjectGeneralMethods.js
index d11db2ce9..322be8475 100644
--- a/src/PersonObjects/Player/PlayerObjectGeneralMethods.js
+++ b/src/PersonObjects/Player/PlayerObjectGeneralMethods.js
@@ -411,7 +411,7 @@ export function recordMoneySource(amt, source) {
export function gainHackingExp(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;
if(this.hacking_exp < 0) {
@@ -421,7 +421,7 @@ export function gainHackingExp(exp) {
export function gainStrengthExp(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;
if(this.strength_exp < 0) {
@@ -431,7 +431,7 @@ export function gainStrengthExp(exp) {
export function gainDefenseExp(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;
if(this.defense_exp < 0) {
@@ -441,7 +441,7 @@ export function gainDefenseExp(exp) {
export function gainDexterityExp(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;
if(this.dexterity_exp < 0) {
@@ -451,7 +451,7 @@ export function gainDexterityExp(exp) {
export function gainAgilityExp(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;
if(this.agility_exp < 0) {
@@ -461,7 +461,7 @@ export function gainAgilityExp(exp) {
export function gainCharismaExp(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;
if(this.charisma_exp < 0) {
@@ -471,7 +471,7 @@ export function gainCharismaExp(exp) {
export function gainIntelligenceExp(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) {
this.intelligence_exp += exp;
@@ -1827,7 +1827,6 @@ export function isQualified(company, position) {
/********** Reapplying Augmentations and Source File ***********/
export function reapplyAllAugmentations(resetMultipliers=true) {
- console.log("Re-applying augmentations");
if (resetMultipliers) {
this.resetMultipliers();
}
@@ -1856,7 +1855,6 @@ export function reapplyAllAugmentations(resetMultipliers=true) {
}
export function reapplyAllSourceFiles() {
- console.log("Re-applying source files");
//Will always be called after reapplyAllAugmentations() so multipliers do not have to be reset
//this.resetMultipliers();
diff --git a/src/SaveObject.js b/src/SaveObject.js
index 22d5ac4d4..c5e957627 100755
--- a/src/SaveObject.js
+++ b/src/SaveObject.js
@@ -112,7 +112,7 @@ BitburnerSaveObject.prototype.saveGame = function(db) {
var request = objectStore.put(saveString, "save");
request.onerror = function(e) {
- console.log("Error saving game to IndexedDB: " + e);
+ console.error("Error saving game to IndexedDB: " + e);
}
request.onsuccess = function(e) {
@@ -124,7 +124,7 @@ BitburnerSaveObject.prototype.saveGame = function(db) {
} catch(e) {
if (e.code == 22) {
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 " +
"supports it. If you would like to save to localStorage as well, then " +
"consider killing several of your scripts to " +
@@ -247,7 +247,7 @@ function loadGame(saveString) {
try {
Settings.load(saveObj.SettingsSave);
} 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();
}
} else {
@@ -257,7 +257,7 @@ function loadGame(saveString) {
try {
loadFconf(saveObj.FconfSettingsSave);
} catch(e) {
- console.log("ERROR: Failed to parse .fconf Settings.");
+ console.error("ERROR: Failed to parse .fconf Settings.");
}
}
if (saveObj.hasOwnProperty("VersionSave")) {
@@ -281,7 +281,7 @@ function loadGame(saveString) {
try {
loadAllGangs(saveObj.AllGangsSave);
} 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 {
loadFconf(saveObj.FconfSettingsSave);
} 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")) {
@@ -460,7 +460,7 @@ function loadImportedGame(saveObj, saveString) {
try {
loadAllGangs(saveObj.AllGangsSave);
} catch(e) {
- console.log("ERROR: Failed to parse AllGangsSave: " + e);
+ console.error("ERROR: Failed to parse AllGangsSave: " + e);
}
}
diff --git a/src/engine.jsx b/src/engine.jsx
index 997f25b41..d9440f39f 100644
--- a/src/engine.jsx
+++ b/src/engine.jsx
@@ -592,7 +592,7 @@ const Engine = {
factionsList.appendChild(createElement("a", {
class:"a-link-button", innerText:factionName, padding:"4px", margin:"4px",
display:"inline-block",
- clickListener:()=>{
+ clickListener: () => {
Engine.loadFactionContent();
displayFactionContent(factionName);
return false;
@@ -1536,19 +1536,18 @@ window.onload = function() {
indexedDbRequest = window.indexedDB.open("bitburnerSave", 1);
indexedDbRequest.onerror = function(e) {
- console.log("Error opening indexedDB: ");
- console.log(e);
+ console.error("Error opening indexedDB: ");
+ console.error(e);
return Engine.load(null); // Try to load from localstorage
};
indexedDbRequest.onsuccess = function(e) {
- console.log("Opening bitburnerSave database successful!");
indexedDb = e.target.result;
var transaction = indexedDb.transaction(["savestring"]);
var objectStore = transaction.objectStore("savestring");
var request = objectStore.get("save");
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
}
diff --git a/utils/DialogBox.js b/utils/DialogBox.js
index aa165bb94..8f59abe1a 100644
--- a/utils/DialogBox.js
+++ b/utils/DialogBox.js
@@ -42,7 +42,6 @@ document.addEventListener("keydown", function (event) {
let dialogBoxOpened = false;
function dialogBoxCreate(txt, preformatted=false) {
- console.log(`dialogBoxCreate() called`)
var container = document.createElement("div");
container.setAttribute("class", "dialog-box-container");