From d50c5abb66b0d63dd0ce445e41aff36b7ee24ffb Mon Sep 17 00:00:00 2001
From: danielyxie
Date: Wed, 12 Sep 2018 10:53:08 -0500
Subject: [PATCH] Refactored all code that uses the numeral library to use a
wrapper class. Implemented configurable locale setting through this wrapper
class
---
src/ActiveScriptsUI.js | 8 +--
src/Bladeburner.js | 8 +--
src/CharacterOverview.js | 5 +-
src/CompanyManagement.js | 99 +++++++++++++++++++------------------
src/Faction.js | 8 +--
src/Gang.js | 16 +++---
src/Location.js | 7 +--
src/Player.js | 7 +--
src/Script.js | 6 +--
src/StockMarket.js | 84 +++++++++++++++----------------
src/Terminal.js | 32 ++++++------
src/engine.js | 17 ++++---
src/ui/numeralFormat.js | 34 +++++++++++++
src/ui/setSettingsLabels.js | 8 +--
14 files changed, 189 insertions(+), 150 deletions(-)
create mode 100644 src/ui/numeralFormat.js
diff --git a/src/ActiveScriptsUI.js b/src/ActiveScriptsUI.js
index f222986e8..7317ef903 100644
--- a/src/ActiveScriptsUI.js
+++ b/src/ActiveScriptsUI.js
@@ -2,6 +2,7 @@ import {workerScripts,
killWorkerScript} from "./NetscriptWorker";
import {Player} from "./Player";
import {getServer} from "./Server";
+import {numeralWrapper} from "./ui/numeralFormat";
import {dialogBoxCreate} from "../utils/DialogBox";
import {createAccordionElement} from "../utils/uiHelpers/createAccordionElement";
import {arrayToString} from "../utils/helpers/arrayToString";
@@ -10,7 +11,6 @@ import {createProgressBarText} from "../utils/helpers/createProgressBarText"
import {exceptionAlert} from "../utils/helpers/exceptionAlert";
import {getElementById} from "../utils/uiHelpers/getElementById";
import {logBoxCreate} from "../utils/LogBox";
-import numeral from "numeral/min/numeral.min";
import {formatNumber} from "../utils/StringHelperFunctions";
import {removeChildrenFromElement} from "../utils/uiHelpers/removeChildrenFromElement";
import {removeElement} from "../utils/uiHelpers/removeElement";
@@ -242,9 +242,9 @@ function updateActiveScriptsItems(maxTasks=150) {
}
}
- getElementById("active-scripts-total-production-active").innerText = numeral(total).format('$0.000a');
- getElementById("active-scripts-total-prod-aug-total").innerText = numeral(Player.scriptProdSinceLastAug).format('$0.000a');
- getElementById("active-scripts-total-prod-aug-avg").innerText = numeral(Player.scriptProdSinceLastAug / (Player.playtimeSinceLastAug/1000)).format('$0.000a');
+ getElementById("active-scripts-total-production-active").innerText = numeralWrapper.format(total, '$0.000a');
+ getElementById("active-scripts-total-prod-aug-total").innerText = numeralWrapper.format(Player.scriptProdSinceLastAug, '$0.000a');
+ getElementById("active-scripts-total-prod-aug-avg").innerText = numeralWrapper.format(Player.scriptProdSinceLastAug / (Player.playtimeSinceLastAug/1000), '$0.000a');
return total;
}
diff --git a/src/Bladeburner.js b/src/Bladeburner.js
index fcf1494c1..1af878bae 100644
--- a/src/Bladeburner.js
+++ b/src/Bladeburner.js
@@ -7,6 +7,7 @@ import {Faction, Factions, factionExists,
import {Locations} from "./Locations";
import {Player} from "./Player";
import {hackWorldDaemon, redPillFlag} from "./RedPill";
+import {numeralWrapper} from "./ui/numeralFormat";
import {KEY} from "../utils/helpers/keyCodes";
import {createProgressBarText} from "../utils/helpers/createProgressBarText";
@@ -14,7 +15,6 @@ import {dialogBoxCreate} from "../utils/DialogBox";
import {removeChildrenFromElement} from "../utils/uiHelpers/removeChildrenFromElement";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver";
-import numeral from "numeral/min/numeral.min";
import {addOffset} from "../utils/helpers/addOffset";
import {appendLineBreaks} from "../utils/uiHelpers/appendLineBreaks";
import {clearObject} from "../utils/helpers/clearObject";
@@ -1191,7 +1191,7 @@ Bladeburner.prototype.completeAction = function() {
if (isOperation && this.logging.ops) {
this.log(action.name + " successfully completed! Gained " + formatNumber(gain, 3) + " rank");
} else if (!isOperation && this.logging.contracts) {
- this.log(action.name + " contract successfully completed! Gained " + formatNumber(gain, 3) + " rank and " + numeral(moneyGain).format("$0.000a"));
+ this.log(action.name + " contract successfully completed! Gained " + formatNumber(gain, 3) + " rank and " + numeralWrapper.format(moneyGain, "$0.000a"));
}
}
isOperation ? this.completeOperation(true) : this.completeContract(true);
@@ -2207,10 +2207,10 @@ Bladeburner.prototype.updateOverviewContent = function() {
"Team Size: " + formatNumber(this.teamSize, 0) + "
" +
"Team Members Lost: " + formatNumber(this.teamLost, 0) + "
" +
"Num Times Hospitalized: " + this.numHosp + "
" +
- "Money Lost From Hospitalizations: " + numeral(this.moneyLost).format("$0.000a") + "
" +
+ "Money Lost From Hospitalizations: " + numeralWrapper.format(this.moneyLost, "$0.000a") + "
" +
"Current City: " + this.city + "
";
- DomElems.overviewEstPop.childNodes[0].nodeValue = "Est. Synthoid Population: " + numeral(this.getCurrentCity().popEst).format("0.000a");
+ DomElems.overviewEstPop.childNodes[0].nodeValue = "Est. Synthoid Population: " + numeralWrapper.format(this.getCurrentCity().popEst, "0.000a");
DomElems.overviewEstComms.childNodes[0].nodeValue = "Est. Synthoid Communities: " + formatNumber(this.getCurrentCity().comms, 0);
DomElems.overviewChaos.childNodes[0].nodeValue = "City Chaos: " + formatNumber(this.getCurrentCity().chaos);
DomElems.overviewSkillPoints.innerText = "Skill Points: " + formatNumber(this.skillPoints, 0);
diff --git a/src/CharacterOverview.js b/src/CharacterOverview.js
index e2fb03a6a..328f952ab 100644
--- a/src/CharacterOverview.js
+++ b/src/CharacterOverview.js
@@ -1,5 +1,6 @@
import {Player} from "./Player";
-import numeral from "numeral/min/numeral.min";
+
+import {numeralWrapper} from "./ui/numeralFormat";
function CharacterOverview() {
this.hp = document.getElementById("character-hp-text");
@@ -33,7 +34,7 @@ CharacterOverview.prototype.update = function() {
let changed = false;
changed = replaceAndChanged(this.hp, Player.hp + " / " + Player.max_hp) || changed;
- changed = replaceAndChanged(this.money, numeral(Player.money.toNumber()).format('($0.000a)')) || changed;
+ changed = replaceAndChanged(this.money, numeralWrapper.format(Player.money.toNumber(), '($0.000a)')) || changed;
changed = replaceAndChanged(this.hack, (Player.hacking_skill).toLocaleString()) || changed;
changed = replaceAndChanged(this.str, (Player.strength).toLocaleString()) || changed;
changed = replaceAndChanged(this.def, (Player.defense).toLocaleString()) || changed;
diff --git a/src/CompanyManagement.js b/src/CompanyManagement.js
index abb67e1b7..095349577 100644
--- a/src/CompanyManagement.js
+++ b/src/CompanyManagement.js
@@ -5,11 +5,12 @@ import {Locations} from "./Locations";
import {Player} from "./Player";
import Decimal from "decimal.js";
+import {numeralWrapper} from "./ui/numeralFormat";
+
import {dialogBoxCreate} from "../utils/DialogBox";
import {clearSelector} from "../utils/uiHelpers/clearSelector";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver";
-import numeral from "numeral/min/numeral.min";
import {createElement} from "../utils/uiHelpers/createElement";
import {createPopup} from "../utils/uiHelpers/createPopup";
import {Page, routing} from "./ui/navigationTracking";
@@ -453,46 +454,46 @@ var IndustryStartingCosts = {
var IndustryDescriptions = {
Energy: "Engage in the production and distribution of energy.
" +
- "Starting cost: " + numeral(IndustryStartingCosts.Energy).format("$0.000a") + "
" +
+ "Starting cost: " + numeralWrapper.format(IndustryStartingCosts.Energy, "$0.000a") + "
" +
"Recommended starting Industry: NO",
Utilities: "Distributes water and provides wastewater services.
" +
- "Starting cost: " + numeral(IndustryStartingCosts.Utilities).format("$0.000a") + "
" +
+ "Starting cost: " + numeralWrapper.format(IndustryStartingCosts.Utilities, "$0.000a") + "
" +
"Recommended starting Industry: NO",
Agriculture: "Cultive crops and breed livestock to produce food.
" +
- "Starting cost: " + numeral(IndustryStartingCosts.Agriculture).format("$0.000a") + "
" +
+ "Starting cost: " + numeralWrapper.format(IndustryStartingCosts.Agriculture, "$0.000a") + "
" +
"Recommended starting Industry: YES",
Fishing: "Produce food through the breeding and processing of fish and fish products
" +
- "Starting cost: " + numeral(IndustryStartingCosts.Fishing).format("$0.000a") + "
" +
+ "Starting cost: " + numeralWrapper.format(IndustryStartingCosts.Fishing, "$0.000a") + "
" +
"Recommended starting Industry: NO",
Mining: "Extract and process metals from the earth.
" +
- "Starting cost: " + numeral(IndustryStartingCosts.Mining).format("$0.000a") + "
" +
+ "Starting cost: " + numeralWrapper.format(IndustryStartingCosts.Mining, "$0.000a") + "
" +
"Recommended starting Industry: NO",
Food: "Create your own restaurants all around the world.
" +
- "Starting cost: " + numeral(IndustryStartingCosts.Food).format("$0.000a") + "
" +
+ "Starting cost: " + numeralWrapper.format(IndustryStartingCosts.Food, "$0.000a") + "
" +
"Recommended starting Industry: YES",
Tobacco: "Create and distribute tobacco and tobacco-related products.
" +
- "Starting cost: " + numeral(IndustryStartingCosts.Tobacco).format("$0.000a") + "
" +
+ "Starting cost: " + numeralWrapper.format(IndustryStartingCosts.Tobacco, "$0.000a") + "
" +
"Recommended starting Industry: YES",
Chemical: "Product industrial chemicals
" +
- "Starting cost: " + numeral(IndustryStartingCosts.Chemical).format("$0.000a") + "
" +
+ "Starting cost: " + numeralWrapper.format(IndustryStartingCosts.Chemical, "$0.000a") + "
" +
"Recommended starting Industry: NO",
Pharmaceutical: "Discover, develop, and create new pharmaceutical drugs.
" +
- "Starting cost: " + numeral(IndustryStartingCosts.Pharmaceutical).format("$0.000a") + "
" +
+ "Starting cost: " + numeralWrapper.format(IndustryStartingCosts.Pharmaceutical, "$0.000a") + "
" +
"Recommended starting Industry: NO",
Computer: "Develop and manufacture new computer hardware and networking infrastructures.
" +
- "Starting cost: " + numeral(IndustryStartingCosts.Computer).format("$0.000a") + "
" +
+ "Starting cost: " + numeralWrapper.format(IndustryStartingCosts.Computer, "$0.000a") + "
" +
"Recommended starting Industry: NO",
Robotics: "Develop and create robots.
" +
- "Starting cost: " + numeral(IndustryStartingCosts.Robotics).format("$0.000a") + "
" +
+ "Starting cost: " + numeralWrapper.format(IndustryStartingCosts.Robotics, "$0.000a") + "
" +
"Recommended starting Industry: NO",
Software: "Develop computer software and create AI Cores.
" +
- "Starting cost: " + numeral(IndustryStartingCosts.Software).format("$0.000a") + "
" +
+ "Starting cost: " + numeralWrapper.format(IndustryStartingCosts.Software, "$0.000a") + "
" +
"Recommended starting Industry: YES",
Healthcare: "Create and manage hospitals.
" +
- "Starting cost: " + numeral(IndustryStartingCosts.Healthcare).format("$0.000a") + "
" +
+ "Starting cost: " + numeralWrapper.format(IndustryStartingCosts.Healthcare, "$0.000a") + "
" +
"Recommended starting Industry: NO",
RealEstate: "Develop and manage real estate properties.
" +
- "Starting cost: " + numeral(IndustryStartingCosts.RealEstate).format("$0.000a") + "
" +
+ "Starting cost: " + numeralWrapper.format(IndustryStartingCosts.RealEstate, "$0.000a") + "
" +
"Recommended starting Industry: NO",
}
@@ -1776,7 +1777,7 @@ Employee.prototype.createUI = function(panel, corporation) {
"Experience: " + formatNumber(this.exp, 3) + "
" +
"Creativity: " + formatNumber(effCre, 3) + "
" +
"Efficiency: " + formatNumber(effEff, 3) + "
" +
- "Salary: " + numeral(this.sal).format("$0.000a") + "/ s
",
+ "Salary: " + numeralWrapper.format(this.sal, "$0.000a") + "/ s
",
}));
//Selector for employee position
@@ -1826,7 +1827,7 @@ Employee.prototype.updateUI = function(panel, corporation) {
"Experience: " + formatNumber(this.exp, 3) + "
" +
"Creativity: " + formatNumber(effCre, 3) + "
" +
"Efficiency: " + formatNumber(effEff, 3) + "
" +
- "Salary: " + numeral(this.sal).format("$0.000a") + "/ s
";
+ "Salary: " + numeralWrapper.format(this.sal, "$0.000a") + "/ s
";
}
Employee.prototype.toJSON = function() {
@@ -1963,7 +1964,7 @@ OfficeSpace.prototype.findEmployees = function(parentRefs) {
"Experience: " + formatNumber(employee.exp, 1) + "
" +
"Creativity: " + formatNumber(employee.cre, 1) + "
" +
"Efficiency: " + formatNumber(employee.eff, 1) + "
" +
- "Salary: " + numeral(employee.sal).format('$0.000a') + " \ s
",
+ "Salary: " + numeralWrapper.format(employee.sal, '$0.000a') + " \ s
",
clickListener:()=>{
office.hireEmployee(employee, parentRefs);
removeElementById("cmpy-mgmt-hire-employee-popup");
@@ -2155,7 +2156,7 @@ Warehouse.prototype.createUI = function(parentRefs) {
//Upgrade warehouse size button
var upgradeCost = WarehouseUpgradeBaseCost * Math.pow(1.07, this.level+1);
industryWarehouseUpgradeSizeButton = createElement("a", {
- innerText:"Upgrade Warehouse Size - " + numeral(upgradeCost).format('$0.000a'),
+ innerText:"Upgrade Warehouse Size - " + numeralWrapper.format(upgradeCost, '$0.000a'),
display:"inline-block",
class: company.funds.lt(upgradeCost) ? "a-link-button-inactive" : "a-link-button",
clickListener:()=>{
@@ -2721,9 +2722,9 @@ Warehouse.prototype.createProductUI = function(product, parentRefs) {
"Aesthetics: " + formatNumber(product.aes, 3) + "
" +
"Features: " + formatNumber(product.fea, 3) +
cmpAndDmdText + "
" +
- "Est. Production Cost: " + numeral(product.pCost / ProductProductionCostRatio).format("$0.000a") +
+ "
Est. Production Cost: " + numeralWrapper.format(product.pCost / ProductProductionCostRatio, "$0.000a") +
"An estimate of the material cost it takes to create this Product.
" +
- "Est. Market Price: " + numeral(product.pCost + product.rat / product.mku).format("$0.000a") +
+ "
Est. Market Price: " + numeralWrapper.format(product.pCost + product.rat / product.mku, "$0.000a") +
"An estimate of how much consumers are willing to pay for this product. " +
"Setting the sale price above this may result in less sales. Setting the sale price below this may result " +
"in more sales.
"
@@ -2740,7 +2741,7 @@ Warehouse.prototype.createProductUI = function(product, parentRefs) {
if (isString(product.sCost)) {
sellInnerTextString += (" @ " + product.sCost);
} else {
- sellInnerTextString += (" @ " + numeral(product.sCost).format("$0.000a"));
+ sellInnerTextString += (" @ " + numeralWrapper.format(product.sCost, "$0.000a"));
}
}
div.appendChild(createElement("a", {
@@ -3175,9 +3176,9 @@ Corporation.prototype.getInvestment = function() {
noBtn.addEventListener("click", ()=>{
return yesNoBoxClose();
});
- yesNoBoxCreate("An investment firm has offered you " + numeral(funding).format('$0.000a') +
- " in funding in exchange for a " + numeral(percShares*100).format("0.000a") +
- "% stake in the company (" + numeral(investShares).format('0.000a') + " shares).
" +
+ yesNoBoxCreate("An investment firm has offered you " + numeralWrapper.format(funding, '$0.000a') +
+ " in funding in exchange for a " + numeralWrapper.format(percShares*100, "0.000a") +
+ "% stake in the company (" + numeralWrapper.format(investShares, '0.000a') + " shares).
" +
"Do you accept or reject this offer?");
}
@@ -3188,11 +3189,11 @@ Corporation.prototype.goPublic = function() {
innerHTML: "Enter the number of shares you would like to issue " +
"for your IPO. These shares will be publicly sold " +
"and you will no longer own them. Your Corporation will receive " +
- numeral(initialSharePrice).format('$0.000a') + " per share " +
+ numeralWrapper.format(initialSharePrice, '$0.000a') + " per share " +
"(the IPO money will be deposited directly into your Corporation's funds).
" +
"Furthermore, issuing more shares now will help drive up " +
"your company's stock price in the future.
" +
- "You have a total of " + numeral(this.numShares).format("0.000a") + " of shares that you can issue.",
+ "You have a total of " + numeralWrapper.format(this.numShares, "0.000a") + " of shares that you can issue.",
});
var yesBtn;
var input = createElement("input", {
@@ -3635,7 +3636,7 @@ Corporation.prototype.displayCorporationOverviewContent = function() {
innerHTML: "Enter the number of shares you would like to sell. The money from " +
"selling your shares will go directly to you (NOT your Corporation). " +
"The current price of your " +
- "company's stock is " + numeral(currentStockPrice).format("$0.000a"),
+ "company's stock is " + numeralWrapper.format(currentStockPrice, "$0.000a"),
});
var profitIndicator = createElement("p", {});
var input = createElement("input", {
@@ -3648,7 +3649,7 @@ Corporation.prototype.displayCorporationOverviewContent = function() {
profitIndicator.innerText = "You don't have this many shares to sell!";
} else {
profitIndicator.innerText = "Sell " + numShares + " shares for a total of " +
- numeral(numShares * currentStockPrice).format('$0.000a');
+ numeralWrapper.format(numShares * currentStockPrice, '$0.000a');
}
}
});
@@ -3702,7 +3703,7 @@ Corporation.prototype.displayCorporationOverviewContent = function() {
innerHTML: "Enter the number of shares you would like to buy back at market price. To purchase " +
"these shares, you must use your own money (NOT your Corporation's funds). " +
"The current price of your " +
- "company's stock is " + numeral(currentStockPrice).format("$0.000a") +
+ "company's stock is " + numeralWrapper.format(currentStockPrice, "$0.000a") +
". Your company currently has " + formatNumber(this.issuedShares, 3) + " outstanding stock shares",
});
var costIndicator = createElement("p", {});
@@ -3719,7 +3720,7 @@ Corporation.prototype.displayCorporationOverviewContent = function() {
} else {
console.log("here");
costIndicator.innerText = "Purchase " + numShares + " shares for a total of " +
- numeral(numShares * currentStockPrice).format('$0.000a');
+ numeralWrapper.format(numShares * currentStockPrice, '$0.000a');
}
}
});
@@ -3734,7 +3735,7 @@ Corporation.prototype.displayCorporationOverviewContent = function() {
dialogBoxCreate("ERROR: There are not this many oustanding shares to buy back");
} else if (shares * tempStockPrice > Player.money) {
dialogBoxCreate("ERROR: You do not have enough money to purchase this many shares (you need " +
- numeral(shares * tempStockPrice).format("$0.000a") + ")");
+ numeralWrapper.format(shares * tempStockPrice, "$0.000a") + ")");
} else {
this.numShares += shares;
if (isNaN(this.issuedShares)) {
@@ -3958,7 +3959,7 @@ Corporation.prototype.displayCorporationOverviewContent = function() {
upgradeContainer.appendChild(createElement("div", {
class:"cmpy-mgmt-upgrade-div", width:"45%",
- innerHTML:upgrade[2] + " - " + numeral(upgrade[1]).format("$0.000a"),
+ innerHTML:upgrade[2] + " - " + numeralWrapper.format(upgrade[1], "$0.000a"),
tooltip: upgrade[3],
clickListener:()=>{
if (corp.funds.lt(upgrade[1])) {
@@ -3990,7 +3991,7 @@ Corporation.prototype.displayCorporationOverviewContent = function() {
var cost = baseCost * Math.pow(priceMult, corp.upgrades[i]);
upgradeContainer.appendChild(createElement("div", {
class:"cmpy-mgmt-upgrade-div", width:"45%",
- innerHTML:upgrade[4] + " - " + numeral(cost).format("$0.000a"),
+ innerHTML:upgrade[4] + " - " + numeralWrapper.format(cost, "$0.000a"),
tooltip:upgrade[5],
clickListener:()=>{
if (corp.funds.lt(cost)) {
@@ -4018,14 +4019,14 @@ Corporation.prototype.updateCorporationOverviewContent = function() {
totalExpenses = new Decimal(0);
var profit = this.revenue.minus(this.expenses).toNumber(),
- profitStr = profit >= 0 ? numeral(profit).format("$0.000a") : "-" + numeral(-1 * profit).format("$0.000a");
+ profitStr = profit >= 0 ? numeralWrapper.format(profit, "$0.000a") : "-" + numeralWrapper.format(-1 * profit, "$0.000a");
- var txt = "Total Funds: " + numeral(totalFunds.toNumber()).format('$0.000a') + "
" +
- "Total Revenue: " + numeral(this.revenue.toNumber()).format("$0.000a") + " / s
" +
- "Total Expenses: " + numeral(this.expenses.toNumber()).format("$0.000a") + "/ s
" +
+ var txt = "Total Funds: " + numeralWrapper.format(totalFunds.toNumber(), '$0.000a') + "
" +
+ "Total Revenue: " + numeralWrapper.format(this.revenue.toNumber(), "$0.000a") + " / s
" +
+ "Total Expenses: " + numeralWrapper.format(this.expenses.toNumber(), "$0.000a") + "/ s
" +
"Total Profits: " + profitStr + " / s
" +
"Publicly Traded: " + (this.public ? "Yes" : "No") + "
" +
- "Owned Stock Shares: " + numeral(this.numShares).format('0.000a') + "
" +
+ "Owned Stock Shares: " + numeralWrapper.format(this.numShares, '0.000a') + "
" +
"Stock Price: " + (this.public ? "$" + formatNumber(this.sharePrice, 2) : "N/A") + "
";
var prodMult = this.getProductionMultiplier(),
@@ -4071,7 +4072,7 @@ Corporation.prototype.displayDivisionContent = function(division, city) {
var popupId = "cmpy-mgmt-expand-city-popup";
var text = createElement("p", {
innerText: "Would you like to expand into a new city by opening an office? " +
- "This would cost " + numeral(OfficeInitialCost).format('$0.000a'),
+ "This would cost " + numeralWrapper.format(OfficeInitialCost, '$0.000a'),
});
var citySelector = createElement("select", {class: "dropdown", margin:"5px"});
for (var cityName in division.offices) {
@@ -4180,7 +4181,7 @@ Corporation.prototype.displayDivisionContent = function(division, city) {
}
industryOverviewUpgrades.appendChild(createElement("div", {
class:"cmpy-mgmt-upgrade-div", display:"inline-block",
- innerHTML:upgrade[4] + ' - ' + numeral(cost).format("$0.000a"),
+ innerHTML:upgrade[4] + ' - ' + numeralWrapper.format(cost, "$0.000a"),
tooltip:upgrade[5],
clickListener:()=>{
if (corp.funds.lt(cost)) {
@@ -4428,7 +4429,7 @@ Corporation.prototype.displayDivisionContent = function(division, city) {
var confirmBtn = createElement("a", {
class: this.funds.lt(upgradeCost) ? "a-link-button-inactive" : "a-link-button",
display:"inline-block", margin:"4px", innerText:"by 3",
- tooltip:numeral(upgradeCost).format("$0.000a"),
+ tooltip:numeralWrapper.format(upgradeCost, "$0.000a"),
clickListener:()=>{
if (this.funds.lt(upgradeCost)) {
dialogBoxCreate("You don't have enough company funds to purchase this upgrade!");
@@ -4445,7 +4446,7 @@ Corporation.prototype.displayDivisionContent = function(division, city) {
var confirmBtn15 = createElement("a", {
class: this.funds.lt(upgradeCost15) ? "a-link-button-inactive" : "a-link-button",
display:"inline-block", margin:"4px", innerText:"by 15",
- tooltip:numeral(upgradeCost15).format("$0.000a"),
+ tooltip:numeralWrapper.format(upgradeCost15, "$0.000a"),
clickListener:()=>{
if (this.funds.lt(upgradeCost15)) {
dialogBoxCreate("You don't have enough company funds to purchase this upgrade!");
@@ -4462,7 +4463,7 @@ Corporation.prototype.displayDivisionContent = function(division, city) {
var confirmBtnMax = createElement("a", {
class:this.funds.lt(upgradeCostMax) ? "a-link-button-inactive" : "a-link-button",
display:"inline-block", margin:"4px", innerText:"by MAX (" + maxNum*OfficeInitialSize + ")",
- tooltip:numeral(upgradeCostMax).format("$0.000a"),
+ tooltip:numeralWrapper.format(upgradeCostMax, "$0.000a"),
clickListener:()=>{
if (this.funds.lt(upgradeCostMax)) {
dialogBoxCreate("You don't have enough company funds to purchase this upgrade!");
@@ -4511,7 +4512,7 @@ Corporation.prototype.displayDivisionContent = function(division, city) {
totalCostTxt.innerText = "Invalid value entered!"
} else {
var totalCost = input.value * office.employees.length;
- totalCostTxt.innerText = "Throwing this party will cost a total of " + numeral(totalCost).format('$0.000a');
+ totalCostTxt.innerText = "Throwing this party will cost a total of " + numeralWrapper.format(totalCost, '$0.000a');
}
},
onkeyup:(e)=>{
@@ -4726,7 +4727,7 @@ Corporation.prototype.updateDivisionContent = function(division) {
var vechain = (this.unlockUpgrades[4] === 1);
//Industry Overview Text
var profit = division.lastCycleRevenue.minus(division.lastCycleExpenses).toNumber(),
- profitStr = profit >= 0 ? numeral(profit).format("$0.000a") : "-" + numeral(-1 * profit).format("$0.000a");
+ profitStr = profit >= 0 ? numeralWrapper.format(profit, "$0.000a") : "-" + numeralWrapper.format(-1 * profit, "$0.000a");
var advertisingInfo = "";
if (vechain) {
var advertisingFactors = division.getAdvertisingFactors();
@@ -4745,12 +4746,12 @@ Corporation.prototype.updateDivisionContent = function(division) {
removeChildrenFromElement(industryOverviewText);
industryOverviewText.appendChild(createElement("p", {
- innerHTML:"Industry: " + division.type + " (Corp Funds: " + numeral(this.funds.toNumber()).format("$0.000a") + ")
" +
+ innerHTML:"Industry: " + division.type + " (Corp Funds: " + numeralWrapper.format(this.funds.toNumber(), "$0.000a") + ")
" +
"Awareness: " + formatNumber(division.awareness, 3) + "
" +
"Popularity: " + formatNumber(division.popularity, 3) + "
" +
advertisingInfo + "
" +
- "Revenue: " + numeral(division.lastCycleRevenue.toNumber()).format("$0.000a") + " / s
" +
- "Expenses: " + numeral(division.lastCycleExpenses.toNumber()).format("$0.000a") + " /s
" +
+ "Revenue: " + numeralWrapper.format(division.lastCycleRevenue.toNumber(), "$0.000a") + " / s
" +
+ "Expenses: " + numeralWrapper.format(division.lastCycleExpenses.toNumber(), "$0.000a") + " /s
" +
"Profit: " + profitStr + " / s
"
}));
industryOverviewText.appendChild(createElement("p", {
diff --git a/src/Faction.js b/src/Faction.js
index fe3d0b094..7d92905ff 100644
--- a/src/Faction.js
+++ b/src/Faction.js
@@ -10,13 +10,13 @@ import {Player} from "./Player";
import {Settings} from "./Settings";
import {Page, routing} from "./ui/navigationTracking";
+import {numeralWrapper} from "./ui/numeralFormat";
import {dialogBoxCreate} from "../utils/DialogBox";
import {factionInvitationBoxCreate} from "../utils/FactionInvitationBox";
import {removeChildrenFromElement} from "../utils/uiHelpers/removeChildrenFromElement";
import {createElement} from "../utils/uiHelpers/createElement";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver";
-import numeral from "numeral/min/numeral.min";
import {formatNumber} from "../utils/StringHelperFunctions";
import {yesNoBoxCreate, yesNoBoxGetYesButton,
yesNoBoxGetNoButton, yesNoBoxClose} from "../utils/YesNoBox";
@@ -337,7 +337,7 @@ function displayFactionContent(factionName) {
Player.loseMoney(amt);
var repGain = amt / CONSTANTS.DonateMoneyToRepDivisor * Player.faction_rep_mult;
faction.playerReputation += repGain;
- dialogBoxCreate("You just donated " + numeral(amt).format("$0.000a") + " to " +
+ dialogBoxCreate("You just donated " + numeralWrapper.format(amt, "$0.000a") + " to " +
faction.name + " to gain " + formatNumber(repGain, 3) + " reputation");
displayFactionContent(factionName);
}
@@ -603,10 +603,10 @@ function createFactionAugmentationDisplayElements(augmentationsList, augs, facti
pElem.innerHTML = "ALREADY OWNED";
} else if (faction.playerReputation >= req) {
aElem.setAttribute("class", "a-link-button");
- pElem.innerHTML = "UNLOCKED - " + numeral(aug.baseCost * factionInfo.augmentationPriceMult).format("$0.000a");
+ pElem.innerHTML = "UNLOCKED - " + numeralWrapper.format(aug.baseCost * factionInfo.augmentationPriceMult, "$0.000a");
} else {
aElem.setAttribute("class", "a-link-button-inactive");
- pElem.innerHTML = "LOCKED (Requires " + formatNumber(req, 1) + " faction reputation) - " + numeral(aug.baseCost * factionInfo.augmentationPriceMult).format("$0.000a");
+ pElem.innerHTML = "LOCKED (Requires " + formatNumber(req, 1) + " faction reputation) - " + numeralWrapper.format(aug.baseCost * factionInfo.augmentationPriceMult, "$0.000a");
pElem.style.color = "red";
}
aDiv.appendChild(aElem);
diff --git a/src/Gang.js b/src/Gang.js
index cf80569c6..576452328 100644
--- a/src/Gang.js
+++ b/src/Gang.js
@@ -3,6 +3,7 @@ import {Engine} from "./engine";
import {Faction, Factions,
displayFactionContent} from "./Faction";
import {Player} from "./Player";
+import {numeralWrapper} from "./ui/numeralFormat";
import {dialogBoxCreate} from "../utils/DialogBox";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver";
@@ -10,7 +11,6 @@ import {createAccordionElement} from "../utils/uiHelpers/createA
import {createElement} from "../utils/uiHelpers/createElement";
import {createPopup} from "../utils/uiHelpers/createPopup";
import {Page, routing} from "./ui/navigationTracking";
-import numeral from "numeral/min/numeral.min";
import {formatNumber} from "../utils/StringHelperFunctions";
import {getRandomInt} from "../utils/helpers/getRandomInt";
import {removeChildrenFromElement} from "../utils/uiHelpers/removeChildrenFromElement";
@@ -892,7 +892,7 @@ function createGangMemberUpgradePanel(memberObj) {
var upg = upgradeArray[j];
(function (upg, div, memberObj) {
div.appendChild(createElement("a", {
- innerText:upg.name + " - " + numeral(upg.cost).format("$0.000a"),
+ innerText:upg.name + " - " + numeralWrapper.format(upg.cost, "$0.000a"),
class:"a-link-button", margin:"2px", padding:"2px", display:"block",
fontSize:"12px",
tooltip:upg.desc,
@@ -1411,12 +1411,12 @@ function updateGangMemberDisplayElement(memberObj) {
var stats = document.getElementById(name + "gang-member-stats-text");
if (stats) {
stats.innerHTML =
- "Hacking: " + formatNumber(memberObj.hack, 0) + " (" + numeral(memberObj.hack_exp).format('(0.00a)') + " exp)
" +
- "Strength: " + formatNumber(memberObj.str, 0) + " (" + numeral(memberObj.str_exp).format('(0.00a)') + " exp)
" +
- "Defense: " + formatNumber(memberObj.def, 0) + " (" + numeral(memberObj.def_exp).format('(0.00a)') + " exp)
" +
- "Dexterity: " + formatNumber(memberObj.dex, 0) + " (" + numeral(memberObj.dex_exp).format('(0.00a)') + " exp)
" +
- "Agility: " + formatNumber(memberObj.agi, 0) + " (" + numeral(memberObj.agi_exp).format('(0.00a)') + " exp)
" +
- "Charisma: " + formatNumber(memberObj.cha, 0) + " (" + numeral(memberObj.cha_exp).format('(0.00a)') + " exp)
";
+ "Hacking: " + formatNumber(memberObj.hack, 0) + " (" + numeralWrapper.format(memberObj.hack_exp, '(0.00a)') + " exp)
" +
+ "Strength: " + formatNumber(memberObj.str, 0) + " (" + numeralWrapper.format(memberObj.str_exp, '(0.00a)') + " exp)
" +
+ "Defense: " + formatNumber(memberObj.def, 0) + " (" + numeralWrapper.format(memberObj.def_exp, '(0.00a)') + " exp)
" +
+ "Dexterity: " + formatNumber(memberObj.dex, 0) + " (" + numeralWrapper.format(memberObj.dex_exp, '(0.00a)') + " exp)
" +
+ "Agility: " + formatNumber(memberObj.agi, 0) + " (" + numeralWrapper.format(memberObj.agi_exp, '(0.00a)') + " exp)
" +
+ "Charisma: " + formatNumber(memberObj.cha, 0) + " (" + numeralWrapper.format(memberObj.cha_exp, '(0.00a)') + " exp)
";
}
var gainInfo = document.getElementById(name + "gang-member-gain-info");
diff --git a/src/Location.js b/src/Location.js
index 4abaee68f..e4713e6e9 100644
--- a/src/Location.js
+++ b/src/Location.js
@@ -15,10 +15,11 @@ import {purchaseServer,
import {Settings} from "./Settings";
import {SpecialServerNames, SpecialServerIps} from "./SpecialServerIps";
+import {numeralWrapper} from "./ui/numeralFormat";
+
import {dialogBoxCreate} from "../utils/DialogBox";
import {clearEventListeners} from "../utils/uiHelpers/clearEventListeners";
import {createRandomIp} from "../utils/IPAddress";
-import numeral from "numeral/min/numeral.min";
import {formatNumber} from "../utils/StringHelperFunctions";
import {yesNoBoxCreate, yesNoTxtInpBoxCreate,
yesNoBoxGetYesButton, yesNoBoxGetNoButton,
@@ -1788,7 +1789,7 @@ function initLocationButtons() {
});
yesNoBoxCreate("Would you like to purchase additional RAM for your home computer?
" +
"This will upgrade your RAM from " + ram + "GB to " + ram*2 + "GB.
" +
- "This will cost " + numeral(cost).format('$0.000a'));
+ "This will cost " + numeralWrapper.format(cost, '$0.000a'));
});
purchaseHomeCores.addEventListener("click", function(e) {
@@ -1825,7 +1826,7 @@ function initLocationButtons() {
yesNoBoxCreate("Would you like to purchase an additional CPU Core for your home computer? Each CPU Core " +
"lets you start with an additional Core Node in Hacking Missions.
" +
"Purchasing an additional core (for a total of " + (Player.getHomeComputer().cpuCores + 1) + ") will " +
- "cost " + numeral(cost).format('$0.000a'));
+ "cost " + numeralWrapper.format(cost, '$0.000a'));
});
travelToAevum.addEventListener("click", function(e) {
diff --git a/src/Player.js b/src/Player.js
index c05c9c8cb..a47debd37 100644
--- a/src/Player.js
+++ b/src/Player.js
@@ -21,12 +21,13 @@ import {SpecialServerIps, SpecialServerNames} from "./SpecialServerIps";
import {SourceFiles, applySourceFile} from "./SourceFile";
import Decimal from "decimal.js";
+import {numeralWrapper} from "./ui/numeralFormat";
+
import {dialogBoxCreate} from "../utils/DialogBox";
import {clearEventListeners} from "../utils/uiHelpers/clearEventListeners";
import {createRandomIp} from "../utils/IPAddress";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver";
-import numeral from "numeral/min/numeral.min";
import {formatNumber,
convertTimeMsToTimeElapsedString} from "../utils/StringHelperFunctions";
@@ -1486,7 +1487,7 @@ PlayerObject.prototype.finishCrime = function(cancelled) {
if (this.committingCrimeThruSingFn) {
if(this.singFnCrimeWorkerScript.disableLogs.ALL == null && this.singFnCrimeWorkerScript.disableLogs.commitCrime == null) {
this.singFnCrimeWorkerScript.scriptRef.log("Crime successful! Gained " +
- numeral(this.workMoneyGained).format("$0.000a") + ", " +
+ numeralWrapper.format(this.workMoneyGained, "$0.000a") + ", " +
formatNumber(this.workHackExpGained, 3) + " hack exp, " +
formatNumber(this.workStrExpGained, 3) + " str exp, " +
formatNumber(this.workDefExpGained, 3) + " def exp, " +
@@ -1600,7 +1601,7 @@ PlayerObject.prototype.hospitalize = function() {
dialogBoxCreate(
"You were in critical condition! You were taken to the hospital where " +
"luckily they were able to save your life. You were charged " +
- numeral(this.max_hp * CONSTANTS.HospitalCostPerHp).format('$0.000a')
+ numeralWrapper.format(this.max_hp * CONSTANTS.HospitalCostPerHp, '$0.000a')
);
}
diff --git a/src/Script.js b/src/Script.js
index 27c60e193..4247ec7b0 100755
--- a/src/Script.js
+++ b/src/Script.js
@@ -33,7 +33,7 @@ import {post} from "./ui/postToTerminal";
import {TextFile} from "./TextFile";
import {parse, Node} from "../utils/acorn";
import {Page, routing} from "./ui/navigationTracking";
-import numeral from "numeral/min/numeral.min";
+import {numeralWrapper} from "./ui/numeralFormat";
import {dialogBoxCreate} from "../utils/DialogBox";
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver";
@@ -251,7 +251,7 @@ function updateScriptEditorContent() {
var codeCopy = code.repeat(1);
var ramUsage = calculateRamUsage(codeCopy);
if (ramUsage !== -1) {
- scriptEditorRamText.innerText = "RAM: " + numeral(ramUsage).format('0.00') + " GB";
+ scriptEditorRamText.innerText = "RAM: " + numeralWrapper.format(ramUsage, '0.00') + " GB";
} else {
scriptEditorRamText.innerText = "RAM: Syntax Error";
}
@@ -874,7 +874,7 @@ function scriptCalculateOfflineProduction(runningScriptObj) {
console.log(runningScriptObj.filename + " called grow() on " + serv.hostname + " " + timesGrown + " times while offline");
runningScriptObj.log("Called grow() on " + serv.hostname + " " + timesGrown + " times while offline");
var growth = processSingleServerGrowth(serv, timesGrown * 450);
- runningScriptObj.log(serv.hostname + " grown by " + numeral(growth * 100 - 100).format('0.000000%') + " from grow() calls made while offline");
+ runningScriptObj.log(serv.hostname + " grown by " + numeralWrapper.format(growth * 100 - 100, '0.000000%') + " from grow() calls made while offline");
}
}
diff --git a/src/StockMarket.js b/src/StockMarket.js
index e5c829014..913606b3c 100755
--- a/src/StockMarket.js
+++ b/src/StockMarket.js
@@ -10,7 +10,7 @@ import {clearEventListeners} from "../utils/uiHelpers/clearEv
import {Reviver, Generic_toJSON,
Generic_fromJSON} from "../utils/JSONReviver";
import {Page, routing} from "./ui/navigationTracking";
-import numeral from "numeral/min/numeral.min";
+import {numeralWrapper} from "./ui/numeralFormat";
import {exceptionAlert} from "../utils/helpers/exceptionAlert";
import {getRandomInt} from "../utils/helpers/getRandomInt";
import {KEY} from "../utils/helpers/keyCodes";
@@ -87,7 +87,7 @@ function cancelOrder(params, workerScript=null) {
//Order properties are passed in. Need to look for the order
var stockOrders = StockMarket["Orders"][params.stock.symbol];
var orderTxt = params.stock.symbol + " - " + params.shares + " @ " +
- numeral(params.price).format('$0.000a');
+ numeralWrapper.format(params.price, '$0.000a');
for (var i = 0; i < stockOrders.length; ++i) {
var order = stockOrders[i];
if (params.shares === order.shares &&
@@ -410,7 +410,7 @@ function buyStock(stock, shares) {
var totalPrice = stock.price * shares;
if (Player.money.lt(totalPrice + CONSTANTS.StockMarketCommission)) {
dialogBoxCreate("You do not have enough money to purchase this. You need " +
- numeral(totalPrice + CONSTANTS.StockMarketCommission).format('($0.000a)') + ".");
+ numeralWrapper.format(totalPrice + CONSTANTS.StockMarketCommission, '($0.000a)') + ".");
return false;
}
@@ -420,9 +420,9 @@ function buyStock(stock, shares) {
stock.playerShares += shares;
stock.playerAvgPx = newTotal / stock.playerShares;
updateStockPlayerPosition(stock);
- dialogBoxCreate("Bought " + numeral(shares).format('0,0') + " shares of " + stock.symbol + " at " +
- numeral(stock.price).format('($0.000a)') + " per share. Paid " +
- numeral(CONSTANTS.StockMarketCommission).format('($0.000a)') + " in commission fees.");
+ dialogBoxCreate("Bought " + numeralWrapper.format(shares, '0,0') + " shares of " + stock.symbol + " at " +
+ numeralWrapper.format(stock.price, '($0.000a)') + " per share. Paid " +
+ numeralWrapper.format(CONSTANTS.StockMarketCommission, '($0.000a)') + " in commission fees.");
return true;
}
@@ -443,9 +443,9 @@ function sellStock(stock, shares) {
stock.playerAvgPx = 0;
}
updateStockPlayerPosition(stock);
- dialogBoxCreate("Sold " + numeral(shares).format('0,0') + " shares of " + stock.symbol + " at " +
- numeral(stock.price).format('($0.000a)') + " per share. After commissions, you gained " +
- "a total of " + numeral(gains).format('($0.000a)') + ".");
+ dialogBoxCreate("Sold " + numeralWrapper.format(shares, '0,0') + " shares of " + stock.symbol + " at " +
+ numeralWrapper.format(stock.price, '($0.000a)') + " per share. After commissions, you gained " +
+ "a total of " + numeralWrapper.format(gains, '($0.000a)') + ".");
return true;
}
@@ -469,10 +469,10 @@ function shortStock(stock, shares, workerScript=null) {
if (tixApi) {
workerScript.scriptRef.log("ERROR: shortStock() failed because you do not have enough " +
"money to purchase this short position. You need " +
- numeral(totalPrice + CONSTANTS.StockMarketCommission).format('($0.000a)') + ".");
+ numeralWrapper.format(totalPrice + CONSTANTS.StockMarketCommission, '($0.000a)') + ".");
} else {
dialogBoxCreate("You do not have enough money to purchase this short position. You need " +
- numeral(totalPrice + CONSTANTS.StockMarketCommission).format('($0.000a)') + ".");
+ numeralWrapper.format(totalPrice + CONSTANTS.StockMarketCommission, '($0.000a)') + ".");
}
return false;
@@ -486,14 +486,14 @@ function shortStock(stock, shares, workerScript=null) {
updateStockPlayerPosition(stock);
if (tixApi) {
if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.shortStock == null) {
- workerScript.scriptRef.log("Bought a short position of " + numeral(shares).format('0,0') + " shares of " + stock.symbol + " at " +
- numeral(stock.price).format('($0.000a)') + " per share. Paid " +
- numeral(CONSTANTS.StockMarketCommission).format('($0.000a)') + " in commission fees.");
+ workerScript.scriptRef.log("Bought a short position of " + numeralWrapper.format(shares, '0,0') + " shares of " + stock.symbol + " at " +
+ numeralWrapper.format(stock.price, '($0.000a)') + " per share. Paid " +
+ numeralWrapper.format(CONSTANTS.StockMarketCommission, '($0.000a)') + " in commission fees.");
}
} else {
- dialogBoxCreate("Bought a short position of " + numeral(shares).format('0,0') + " shares of " + stock.symbol + " at " +
- numeral(stock.price).format('($0.000a)') + " per share. Paid " +
- numeral(CONSTANTS.StockMarketCommission).format('($0.000a)') + " in commission fees.");
+ dialogBoxCreate("Bought a short position of " + numeralWrapper.format(shares, '0,0') + " shares of " + stock.symbol + " at " +
+ numeralWrapper.format(stock.price, '($0.000a)') + " per share. Paid " +
+ numeralWrapper.format(CONSTANTS.StockMarketCommission, '($0.000a)') + " in commission fees.");
}
return true;
}
@@ -530,14 +530,14 @@ function sellShort(stock, shares, workerScript=null) {
updateStockPlayerPosition(stock);
if (tixApi) {
if (workerScript.disableLogs.ALL == null && workerScript.disableLogs.sellShort == null) {
- workerScript.scriptRef.log("Sold your short position of " + numeral(shares).format('0,0') + " shares of " + stock.symbol + " at " +
- numeral(stock.price).format('($0.000a)') + " per share. After commissions, you gained " +
- "a total of " + numeral(origCost + profit).format('($0.000a)') + ".");
+ workerScript.scriptRef.log("Sold your short position of " + numeralWrapper.format(shares, '0,0') + " shares of " + stock.symbol + " at " +
+ numeralWrapper.format(stock.price, '($0.000a)') + " per share. After commissions, you gained " +
+ "a total of " + numeralWrapper.format(origCost + profit, '($0.000a)') + ".");
}
} else {
- dialogBoxCreate("Sold your short position of " + numeral(shares).format('0,0') + " shares of " + stock.symbol + " at " +
- numeral(stock.price).format('($0.000a)') + " per share. After commissions, you gained " +
- "a total of " + numeral(origCost + profit).format('($0.000a)') + ".");
+ dialogBoxCreate("Sold your short position of " + numeralWrapper.format(shares, '0,0') + " shares of " + stock.symbol + " at " +
+ numeralWrapper.format(stock.price, '($0.000a)') + " per share. After commissions, you gained " +
+ "a total of " + numeralWrapper.format(origCost + profit, '($0.000a)') + ".");
}
return true;
@@ -696,7 +696,7 @@ function displayStockMarketContent() {
//Purchase WSE Account button
var wseAccountButton = clearEventListeners("stock-market-buy-account");
stylePurchaseButton(wseAccountButton, CONSTANTS.WSEAccountCost, Player.hasWseAccount,
- "Buy WSE Account - " + numeral(CONSTANTS.WSEAccountCost).format('($0.000a)'),
+ "Buy WSE Account - " + numeralWrapper.format(CONSTANTS.WSEAccountCost, '($0.000a)'),
"WSE Account - Purchased");
wseAccountButton.addEventListener("click", function() {
Player.hasWseAccount = true;
@@ -710,7 +710,7 @@ function displayStockMarketContent() {
//Purchase TIX API Access account
var tixApiAccessButton = clearEventListeners("stock-market-buy-tix-api");
stylePurchaseButton(tixApiAccessButton, CONSTANTS.TIXAPICost, Player.hasTixApiAccess,
- "Buy Trade Information eXchange (TIX) API Access - " + numeral(CONSTANTS.TIXAPICost).format('($0.000a)'),
+ "Buy Trade Information eXchange (TIX) API Access - " + numeralWrapper.format(CONSTANTS.TIXAPICost, '($0.000a)'),
"TIX API Access - Purchased");
tixApiAccessButton.addEventListener("click", function() {
Player.hasTixApiAccess = true;
@@ -722,7 +722,7 @@ function displayStockMarketContent() {
//Purchase Four Sigma Market Data Feed
var marketDataButton = clearEventListeners("stock-market-buy-4s-data");
stylePurchaseButton(marketDataButton, CONSTANTS.MarketData4SCost, Player.has4SData,
- "Buy 4S Market Data Access - " + numeral(CONSTANTS.MarketData4SCost).format('($0.000a)'),
+ "Buy 4S Market Data Access - " + numeralWrapper.format(CONSTANTS.MarketData4SCost, '($0.000a)'),
"4S Market Data - Purchased");
marketDataButton.addEventListener("click", function() {
Player.has4SData = true;
@@ -760,7 +760,7 @@ function displayStockMarketContent() {
//Purchase Four Sigma Market Data TIX API (Requires TIX API Access)
var marketDataTixButton = clearEventListeners("stock-market-buy-4s-tix-api");
stylePurchaseButton(marketDataTixButton, CONSTANTS.MarketDataTixApi4SCost, Player.has4SDataTixApi,
- "Buy 4S Market Data TIX API Access - " + numeral(CONSTANTS.MarketDataTixApi4SCost).format('($0.000a)'),
+ "Buy 4S Market Data TIX API Access - " + numeralWrapper.format(CONSTANTS.MarketDataTixApi4SCost, '($0.000a)'),
"4S Market Data TIX API - Purchased");
if (Player.hasTixApiAccess) {
marketDataTixButton.addEventListener("click", function() {
@@ -823,7 +823,7 @@ function displayStockMarketContent() {
console.log("Creating Stock Market UI");
commissionText.innerHTML =
"Commission Fees: Every transaction you make has a " +
- numeral(CONSTANTS.StockMarketCommission).format('($0.000a)') + " commission fee.
" +
+ numeralWrapper.format(CONSTANTS.StockMarketCommission, '($0.000a)') + " commission fee.
" +
"WARNING: When you reset after installing Augmentations, the Stock Market is reset. " +
"This means all your positions are lost, so make sure to sell your stocks before installing " +
"Augmentations!";
@@ -1020,7 +1020,7 @@ function createStockTicker(stock) {
var li = document.createElement("li"), hdr = document.createElement("button");
hdr.classList.add("accordion-header");
hdr.setAttribute("id", tickerId + "-hdr");
- hdr.innerHTML = stock.name + " - " + stock.symbol + " - " + numeral(stock.price).format('($0.000a)');
+ hdr.innerHTML = stock.name + " - " + stock.symbol + " - " + numeralWrapper.format(stock.price, '($0.000a)');
//Div for entire panel
var stockDiv = document.createElement("div");
@@ -1297,9 +1297,9 @@ function updateStockTicker(stock, increase) {
}
return;
}
- let hdrText = stock.name + " (" + stock.symbol + ") - " + numeral(stock.price).format('($0.000a)');
+ let hdrText = stock.name + " (" + stock.symbol + ") - " + numeralWrapper.format(stock.price, '($0.000a)');
if (Player.has4SData) {
- hdrText += " - Volatility: " + numeral(stock.mv).format('0,0.00') + "%" +
+ hdrText += " - Volatility: " + numeralWrapper.format(stock.mv, '0,0.00') + "%" +
" - Price Forecast: ";
if (stock.b) {
hdrText += "+".repeat(Math.floor(stock.otlkMag/10) + 1);
@@ -1363,21 +1363,21 @@ function updateStockPlayerPosition(stock) {
"Long Position: " +
"Shares in the long position will increase " +
"in value if the price of the corresponding stock increases
" +
- "
Shares: " + numeral(stock.playerShares).format('0,0') +
- "
Average Price: " + numeral(stock.playerAvgPx).format('$0.000a') +
- " (Total Cost: " + numeral(totalCost).format('$0.000a') + ")" +
- "
Profit: " + numeral(gains).format('$0.000a') +
- " (" + numeral(percentageGains).format('0.00%') + ")
";
+ "
Shares: " + numeralWrapper.format(stock.playerShares, '0,0') +
+ "
Average Price: " + numeralWrapper.format(stock.playerAvgPx, '$0.000a') +
+ " (Total Cost: " + numeralWrapper.format(totalCost, '$0.000a') + ")" +
+ "
Profit: " + numeralWrapper.format(gains, '$0.000a') +
+ " (" + numeralWrapper.format(percentageGains, '0.00%') + ")
";
if (Player.bitNodeN === 8 || (hasWallStreetSF && wallStreetSFLvl >= 2)) {
stock.posTxtEl.innerHTML +=
"Short Position: " +
"Shares in short position will increase " +
"in value if the price of the corresponding stock decreases
" +
- "
Shares: " + numeral(stock.playerShortShares).format('0,0') +
- "
Average Price: " + numeral(stock.playerAvgShortPx).format('$0.000a') +
- " (Total Cost: " + numeral(shortTotalCost).format('$0.000a') + ")" +
- "
Profit: " + numeral(shortGains).format('$0.000a') +
- " (" + numeral(shortPercentageGains).format('0.00%') + ")" +
+ "
Shares: " + numeralWrapper.format(stock.playerShortShares, '0,0') +
+ "
Average Price: " + numeralWrapper.format(stock.playerAvgShortPx, '$0.000a') +
+ " (Total Cost: " + numeralWrapper.format(shortTotalCost, '$0.000a') + ")" +
+ "
Profit: " + numeralWrapper.format(shortGains, '$0.000a') +
+ " (" + numeralWrapper.format(shortPercentageGains, '0.00%') + ")" +
"
Orders:
";
}
@@ -1440,7 +1440,7 @@ function updateStockOrderList(stock) {
var posText = (order.pos === PositionTypes.Long ? "Long Position" : "Short Position");
li.style.color = "white";
li.innerText = order.type + " - " + posText + " - " +
- order.shares + " @ " + numeral(order.price).format('($0.000a)');
+ order.shares + " @ " + numeralWrapper.format(order.price, '($0.000a)');
var cancelButton = document.createElement("span");
cancelButton.classList.add("stock-market-order-cancel-btn");
diff --git a/src/Terminal.js b/src/Terminal.js
index fa2d87b23..38a1878cc 100644
--- a/src/Terminal.js
+++ b/src/Terminal.js
@@ -22,7 +22,6 @@ import {iTutorialNextStep, iTutorialSteps,
import {showLiterature} from "./Literature";
import {showMessage, Message} from "./Message";
import {killWorkerScript, addWorkerScript} from "./NetscriptWorker";
-import numeral from "numeral/min/numeral.min";
import {Player} from "./Player";
import {hackWorldDaemon} from "./RedPill";
import {findRunningScript, RunningScript,
@@ -37,6 +36,7 @@ import {TextFile, getTextFile} from "./TextFile";
import {containsAllStrings,
longestCommonStart} from "../utils/StringHelperFunctions";
import {Page, routing} from "./ui/navigationTracking";
+import {numeralWrapper} from "./ui/numeralFormat";
import {KEY} from "../utils/helpers/keyCodes";
import {addOffset} from "../utils/helpers/addOffset";
import {isString} from "../utils/helpers/isString";
@@ -700,11 +700,11 @@ let Terminal = {
server.fortify(CONSTANTS.ServerFortifyAmount);
- post("Hack successful! Gained " + numeral(moneyGained).format('($0,0.00)') + " and " + numeral(expGainedOnSuccess).format('0.0000') + " hacking EXP");
+ post("Hack successful! Gained " + numeralWrapper.format(moneyGained, '($0,0.00)') + " and " + numeralWrapper.format(expGainedOnSuccess, '0.0000') + " hacking EXP");
} else { //Failure
//Player only gains 25% exp for failure? TODO Can change this later to balance
Player.gainHackingExp(expGainedOnFailure)
- post("Failed to hack " + server.hostname + ". Gained " + numeral(expGainedOnFailure).format('0.0000') + " hacking EXP");
+ post("Failed to hack " + server.hostname + ". Gained " + numeralWrapper.format(expGainedOnFailure, '0.0000') + " hacking EXP");
}
}
@@ -727,10 +727,10 @@ let Terminal = {
else {rootAccess = "NO";}
post("Root Access: " + rootAccess);
post("Required hacking skill: " + currServ.requiredHackingSkill);
- post("Server security level: " + numeral(currServ.hackDifficulty).format('0.000a'));
- post("Chance to hack: " + numeral(calculateHackingChance(currServ) * 100).format('0.00%'));
- post("Time to hack: " + numeral(calculateHackingTime(currServ)).format('0.000') + " seconds");
- post("Total money available on server: $" + numeral(currServ.moneyAvailable).format('$0,0.00'));
+ post("Server security level: " + numeralWrapper.format(currServ.hackDifficulty, '0.000a'));
+ post("Chance to hack: " + numeralWrapper.format(calculateHackingChance(currServ) * 100, '0.00%'));
+ post("Time to hack: " + numeralWrapper.format(calculateHackingTime(currServ), '0.000') + " seconds");
+ post("Total money available on server: $" + numeralWrapper.format(currServ.moneyAvailable, '$0,0.00'));
post("Required number of open ports for NUKE: " + currServ.numOpenPortsRequired);
if (currServ.sshPortOpen) {
@@ -1245,7 +1245,7 @@ let Terminal = {
var scriptBaseRamUsage = currServ.scripts[i].ramUsage;
var ramUsage = scriptBaseRamUsage * numThreads;
- post("This script requires " + numeral(ramUsage).format('0.00') + " GB of RAM to run for " + numThreads + " thread(s)");
+ post("This script requires " + numeralWrapper.format(ramUsage, '0.00') + " GB of RAM to run for " + numThreads + " thread(s)");
return;
}
}
@@ -1597,7 +1597,7 @@ let Terminal = {
var spacesThread = Array(numSpacesThread+1).join(" ");
//Calculate and transform RAM usage
- ramUsage = numeral(script.scriptRef.ramUsage * script.threads).format('0.00') + " GB";
+ ramUsage = numeralWrapper.format(script.scriptRef.ramUsage * script.threads, '0.00') + " GB";
var entry = [script.filename, spacesScript, script.threads, spacesThread, ramUsage];
post(entry.join(""));
@@ -1844,9 +1844,9 @@ let Terminal = {
if (commandArray.length != 1) {
post("Incorrect usage of free command. Usage: free"); return;
}
- post("Total: " + numeral(Player.getCurrentServer().maxRam).format('0.00') + " GB");
- post("Used: " + numeral(Player.getCurrentServer().ramUsed,).format('0.00') + " GB");
- post("Available: " + numeral(Player.getCurrentServer().maxRam - Player.getCurrentServer().ramUsed).format('0.00') + " GB");
+ post("Total: " + numeralWrapper.format(Player.getCurrentServer().maxRam, '0.00') + " GB");
+ post("Used: " + numeralWrapper.format(Player.getCurrentServer().ramUsed, '0.00') + " GB");
+ post("Available: " + numeralWrapper.format(Player.getCurrentServer().maxRam - Player.getCurrentServer().ramUsed, '0.00') + " GB");
},
//First called when the "run [program]" command is called. Checks to see if you
@@ -1967,9 +1967,9 @@ let Terminal = {
post("Server base security level: " + targetServer.baseDifficulty);
post("Server current security level: " + targetServer.hackDifficulty);
post("Server growth rate: " + targetServer.serverGrowth);
- post("Netscript hack() execution time: " + numeral(scriptCalculateHackingTime(targetServer)).format('0.0') + "s");
- post("Netscript grow() execution time: " + numeral(scriptCalculateGrowTime(targetServer)).format('0.0') + "s");
- post("Netscript weaken() execution time: " + numeral(scriptCalculateWeakenTime(targetServer)).format('0.0') + "s");
+ post("Netscript hack() execution time: " + numeralWrapper.format(scriptCalculateHackingTime(targetServer), '0.0') + "s");
+ post("Netscript grow() execution time: " + numeralWrapper.format(scriptCalculateGrowTime(targetServer), '0.0') + "s");
+ post("Netscript weaken() execution time: " + numeralWrapper.format(scriptCalculateWeakenTime(targetServer), '0.0') + "s");
};
programHandlers[Programs.AutoLink.name] = () => {
post("This executable cannot be run.");
@@ -1995,7 +1995,7 @@ let Terminal = {
if(!fulfilled) {
post("Augmentations: " + Player.augmentations.length + " / 30");
- post("Money: " + numeral(Player.money.toNumber()).format('($0.000a)') + " / " + numeral(1e11).format('($0.000a)'));
+ post("Money: " + numeralWrapper.format(Player.money.toNumber(), '($0.000a)') + " / " + numeralWrapper.format(1e11, '($0.000a)'));
post("One path below must be fulfilled...");
post("----------HACKING PATH----------");
post("Hacking skill: " + Player.hacking_skill + " / 2500");
diff --git a/src/engine.js b/src/engine.js
index db60b97ee..954c21ab5 100644
--- a/src/engine.js
+++ b/src/engine.js
@@ -5,13 +5,14 @@ import {clearEventListeners} from "../utils/uiHelpers/clearEv
import {createElement} from "../utils/uiHelpers/createElement";
import {exceptionAlert} from "../utils/helpers/exceptionAlert";
import {removeLoadingScreen} from "../utils/uiHelpers/removeLoadingScreen";
-import numeral from "numeral/min/numeral.min";
+
+import {numeralWrapper} from "./ui/numeralFormat";
+
import {formatNumber,
convertTimeMsToTimeElapsedString,
replaceAt} from "../utils/StringHelperFunctions";
import {loxBoxCreate, logBoxUpdateText,
logBoxOpened} from "../utils/LogBox";
-
import {updateActiveScriptsItems} from "./ActiveScriptsUI";
import {Augmentations, installAugmentations,
initAugmentations, AugmentationNames,
@@ -587,17 +588,17 @@ const Engine = {
'Money: $' + formatNumber(Player.money.toNumber(), 2) + '
' +
'Stats
' +
'Hacking Level: ' + (Player.hacking_skill).toLocaleString() +
- ' (' + numeral(Player.hacking_exp).format('(0.000a)') + ' experience)
' +
+ ' (' + numeralWrapper.format(Player.hacking_exp, '(0.000a)') + ' experience)
' +
'Strength: ' + (Player.strength).toLocaleString() +
- ' (' + numeral(Player.strength_exp).format('(0.000a)') + ' experience)
' +
+ ' (' + numeralWrapper.format(Player.strength_exp, '(0.000a)') + ' experience)
' +
'Defense: ' + (Player.defense).toLocaleString() +
- ' (' + numeral(Player.defense_exp).format('(0.000a)')+ ' experience)
' +
+ ' (' + numeralWrapper.format(Player.defense_exp, '(0.000a)') + ' experience)
' +
'Dexterity: ' + (Player.dexterity).toLocaleString() +
- ' (' + numeral(Player.dexterity_exp).format('(0.000a)') + ' experience)
' +
+ ' (' + numeralWrapper.format(Player.dexterity_exp, '(0.000a)') + ' experience)
' +
'Agility: ' + (Player.agility).toLocaleString() +
- ' (' + numeral(Player.agility_exp).format('(0.000a)') + ' experience)
' +
+ ' (' + numeralWrapper.format(Player.agility_exp, '(0.000a)') + ' experience)
' +
'Charisma: ' + (Player.charisma).toLocaleString() +
- ' (' + numeral(Player.charisma_exp).format('(0.000a)') + ' experience)
' +
+ ' (' + numeralWrapper.format(Player.charisma_exp, '(0.000a)') + ' experience)
' +
intText + '
' +
'Multipliers
' +
'Hacking Chance multiplier: ' + formatNumber(Player.hacking_chance_mult * 100, 2) + '%
' +
diff --git a/src/ui/numeralFormat.js b/src/ui/numeralFormat.js
new file mode 100644
index 000000000..df7f1a2b7
--- /dev/null
+++ b/src/ui/numeralFormat.js
@@ -0,0 +1,34 @@
+import numeral from "numeral";
+import 'numeral/locales/bg';
+import 'numeral/locales/cs';
+import 'numeral/locales/da-dk';
+import 'numeral/locales/de';
+import 'numeral/locales/en-au';
+import 'numeral/locales/en-gb';
+import 'numeral/locales/es';
+import 'numeral/locales/fr';
+import 'numeral/locales/hu';
+import 'numeral/locales/it';
+import 'numeral/locales/lv';
+import 'numeral/locales/no';
+import 'numeral/locales/pl';
+import 'numeral/locales/ru';
+
+class NumeralFormatter {
+ updateLocale(l) {
+ if (numeral.locale(l) == null) {
+ console.warn(`Invalid locale for numeral: ${l}`);
+
+ let defaultValue = 'en';
+ numeral.locale(defaultValue);
+ return false;
+ }
+ return true;
+ }
+
+ format(n, format) {
+ return numeral(n).format(format);
+ }
+}
+
+export const numeralWrapper = new NumeralFormatter();
diff --git a/src/ui/setSettingsLabels.js b/src/ui/setSettingsLabels.js
index 126175619..cfa7dccbf 100644
--- a/src/ui/setSettingsLabels.js
+++ b/src/ui/setSettingsLabels.js
@@ -1,7 +1,8 @@
import {Engine} from "../engine";
import {Settings} from "../Settings";
-import numeral from "numeral/min/numeral.min";
+import {numeralWrapper} from "./NumeralFormat";
+
function setSettingsLabels() {
var nsExecTime = document.getElementById("settingsNSExecTimeRangeValLabel");
@@ -28,6 +29,7 @@ function setSettingsLabels() {
autosaveInterval.innerHTML = Settings.AutosaveInterval;
disableHotkeys.checked = Settings.DisableHotkeys;
locale.value = Settings.Locale;
+ numeralWrapper.updateLocale(Settings.Locale); //Initialize locale
//Set handlers for when input changes for sliders
var nsExecTimeInput = document.getElementById("settingsNSExecTimeRangeVal");
@@ -91,16 +93,14 @@ function setSettingsLabels() {
//Locale selector
locale.onchange = function() {
- if (numeral.locale(locale.value) == null) {
+ if (!numeralWrapper.updateLocale(locale.value)) {
console.warn(`Invalid locale for numeral: ${locale.value}`);
let defaultValue = 'en';
- numeral.locale(defaultValue);
Settings.Locale = defaultValue;
locale.value = defaultValue;
return;
}
-
Settings.Locale = locale.value;
}