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) => + + + {improvements(r[2])} + )} + +
{r[0]} multiplier: {numeralWrapper.formatPercentage(r[1])}
+ } + 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");