diff --git a/src/budget/budget.js b/src/budget/budget.js index d6a1c43d2383654f477a4edf00032b849ce09402..0439e8e0cc63bb811344b19943fa70a3fde2d94f 100644 --- a/src/budget/budget.js +++ b/src/budget/budget.js @@ -8,6 +8,12 @@ App.Budget.table = function(budgetType) { const income = (budgetType === "cash") ? "lastWeeksCashIncome" : "lastWeeksRepIncome"; const expenses = (budgetType === "cash") ? "lastWeeksCashExpenses" : "lastWeeksRepExpenses"; + // Make the total 0 first, otherwise it gets counted as part of the new total + V[income].Total = 0; + V[income].Total = hashSum(V[income]); + V[expenses].Total = 0; + V[expenses].Total = hashSum(V[expenses]); + const tableDiv = document.createElement("div"); tableDiv.classList.add("budget"); @@ -382,21 +388,17 @@ App.Budget.table = function(budgetType) { App.UI.DOM.appendNewElement("div", tableDiv, "Tracked totals"); - // Make the total 0 first, otherwise it gets counted as part of the new total - V[income].Total = 0; - V[income].Total = hashSum(V[income]); - App.UI.DOM.appendNewElement("div", tableDiv, formatColorDOM(Math.trunc(V[income].Total)), ["number", "final-result"]); - V[expenses].Total = 0; - V[expenses].Total = hashSum(V[expenses]); - App.UI.DOM.appendNewElement("div", tableDiv, formatColorDOM(Math.trunc(V[expenses].Total)), + App.UI.DOM.appendNewElement("div", tableDiv, formatNumber(Math.trunc(V[income].Total)), ["number", + "final-result"]); + App.UI.DOM.appendNewElement("div", tableDiv, formatNumber(Math.trunc(V[expenses].Total)), ["number", "final-result"]); - App.UI.DOM.appendNewElement("div", tableDiv, formatColorDOM(Math.trunc(V[income].Total + V[expenses].Total)), + App.UI.DOM.appendNewElement("div", tableDiv, formatNumber(Math.trunc(V[income].Total + V[expenses].Total)), ["number", "final-result"]); if (budgetType === "cash") { App.UI.DOM.appendNewElement("div", tableDiv, `Expenses budget for week ${V.week + 1}`); tableDiv.append(document.createElement("div")); - App.UI.DOM.appendNewElement("div", tableDiv, formatColorDOM(-V.costs), ["number"]); + App.UI.DOM.appendNewElement("div", tableDiv, formatNumber(-V.costs), ["number"]); tableDiv.append(document.createElement("div")); } @@ -404,16 +406,17 @@ App.Budget.table = function(budgetType) { tableDiv.append(document.createElement("div")); tableDiv.append(document.createElement("div")); if (budgetType === "cash") { - App.UI.DOM.appendNewElement("div", tableDiv, formatColorDOM(V.cash - V.cashLastWeek), ["number"]); + App.UI.DOM.appendNewElement("div", tableDiv, formatNumber(V.cash - V.cashLastWeek), ["number"]); } else { - App.UI.DOM.appendNewElement("div", tableDiv, formatColorDOM(V.rep - V.repLastWeek), ["number"]); + App.UI.DOM.appendNewElement("div", tableDiv, formatNumber(V.rep - V.repLastWeek), ["number"]); } if ( (budgetType === "cash" && (V.cash - V.cashLastWeek) === (V.lastWeeksCashIncome.Total + V.lastWeeksCashExpenses.Total)) || (budgetType === "rep" && (V.rep - V.repLastWeek) === (V.lastWeeksRepIncome.Total + V.lastWeeksRepExpenses.Total)) ) { - App.UI.DOM.appendNewElement("div", tableDiv, `The books are balanced, ${properTitle()}!`, ["green", "last-row"]); + App.UI.DOM.appendNewElement("div", tableDiv, `The books are balanced, ${properTitle()}!`, ["green", + "last-row"]); tableDiv.append(document.createElement("div")); tableDiv.append(document.createElement("div")); tableDiv.append(document.createElement("div")); @@ -422,11 +425,11 @@ App.Budget.table = function(budgetType) { tableDiv.append(document.createElement("div")); tableDiv.append(document.createElement("div")); if (budgetType === "cash") { - App.UI.DOM.appendNewElement("div", tableDiv, formatColorDOM( + App.UI.DOM.appendNewElement("div", tableDiv, formatNumber( (V.cash - V.cashLastWeek) - (V.lastWeeksCashIncome.Total + V.lastWeeksCashExpenses.Total) ), ["number"]); } else { - App.UI.DOM.appendNewElement("div", tableDiv, formatColorDOM( + App.UI.DOM.appendNewElement("div", tableDiv, formatNumber( (V.rep - V.repLastWeek) - (V.lastWeeksRepIncome.Total + V.lastWeeksRepExpenses.Total) ), ["number"]); } @@ -444,11 +447,11 @@ App.Budget.table = function(budgetType) { const r = []; if (V[income][category] || V[expenses][category] || V.showAllEntries[budgetType === "cash" ? "costsBudget" : "repBudget"]) { r.push(App.UI.DOM.appendNewElement("div", tableDiv, node, ["entry"])); - r.push(App.UI.DOM.appendNewElement("div", tableDiv, formatColorDOM(V[income][category]), + r.push(App.UI.DOM.appendNewElement("div", tableDiv, formatNumber(V[income][category]), ["number", "entry"])); - r.push(App.UI.DOM.appendNewElement("div", tableDiv, formatColorDOM(-Math.abs(V[expenses][category])), + r.push(App.UI.DOM.appendNewElement("div", tableDiv, formatNumber(-Math.abs(V[expenses][category])), ["number", "entry"])); - r.push(App.UI.DOM.appendNewElement("div", tableDiv, formatColorDOM(V[income][category] + V[expenses][category]), + r.push(App.UI.DOM.appendNewElement("div", tableDiv, formatNumber(V[income][category] + V[expenses][category]), ["number", "entry"])); } return r; @@ -463,9 +466,9 @@ App.Budget.table = function(budgetType) { const r = []; if (groupIn || groupEx || V.showAllEntries[budgetType === "cash" ? "costsBudget" : "repBudget"]) { r.push(App.UI.DOM.appendNewElement("div", tableDiv, title, ["group"])); - r.push(App.UI.DOM.appendNewElement("div", tableDiv, formatColorDOM(groupIn), ["group", "number"])); - r.push(App.UI.DOM.appendNewElement("div", tableDiv, formatColorDOM(groupEx), ["group", "number"])); - r.push(App.UI.DOM.appendNewElement("div", tableDiv, formatColorDOM(groupIn + groupEx), + r.push(App.UI.DOM.appendNewElement("div", tableDiv, formatNumber(groupIn), ["group", "number"])); + r.push(App.UI.DOM.appendNewElement("div", tableDiv, formatNumber(groupEx), ["group", "number"])); + r.push(App.UI.DOM.appendNewElement("div", tableDiv, formatNumber(groupIn + groupEx), ["group", "number"])); } return r; @@ -504,12 +507,12 @@ App.Budget.table = function(budgetType) { } } - function formatColorDOM(num, invert = false) { + function formatNumber(num, invert = false) { if (invert) { num = -1 * num; } let span = document.createElement('span'); - span.textContent = (budgetType === "cash") ? cashFormat(num) : num; + span.append(budgetType === "cash" ? cashFormat(num) : repFormat(num, V.assistant.power < 3)); if (num === 0) { // num overwrites gray, so we don't use it here. span.classList.add("gray"); diff --git a/src/budget/repBudget.js b/src/budget/repBudget.js index f3a1be735b4c0eee337340735e5f31cb08134efb..1e1c0a01f2cbbf9e94f5b52e8ceea86668fbe33d 100644 --- a/src/budget/repBudget.js +++ b/src/budget/repBudget.js @@ -23,7 +23,13 @@ App.Budget.rep = function() { * @returns {HTMLParagraphElement} */ function intro() { - return App.UI.DOM.makeElement("p", `Reputation is a difficult thing to quantify, ${properTitle()}. Here you see an overview of topics that interest people in the arcology, and in turn, reflect on your own reputation. Much like a finance report, you can see here how your choices last week moved you closer to or further from your goals, and head any issues off before they get worse.`, "scene-intro"); + const p = document.createElement("p"); + p.classList.add("scene-intro"); + p.append(`Reputation is a difficult thing to quantify, ${properTitle()}. Here you see an overview of topics that interest people in the arcology, and in turn, reflect on your own reputation. Much like a finance report, you can see here how your choices last week moved you closer to or further from your goals, and head any issues off before they get worse.`); + if (V.assistant.power >= 3) { + p.append(" Thanks to my powerful power computer system I can track reputation changes to an unprecedented degree."); + } + return p; } /** diff --git a/src/js/economyJS.js b/src/js/economyJS.js index 95886e2f86c4630d6d6eb4337697f7f260c0d67e..2033a3ddbb07f07846f643125f8ae25e139c15a2 100644 --- a/src/js/economyJS.js +++ b/src/js/economyJS.js @@ -2597,7 +2597,7 @@ globalThis.cashX = function(cost, what, who) { */ globalThis.repX = function(rep, what, who) { if (!Number.isFinite(rep)) { - V.lastWeeksRepErrors.push(`Expected a finite number for ${what}, but got ${repFormat(rep)}`); + V.lastWeeksRepErrors.push(`Expected a finite number for ${what}, but got ${rep}`); return 0; } @@ -2627,14 +2627,14 @@ globalThis.repX = function(rep, what, who) { // switch over to the net amount gained for the rest of the logic rep = curvedRep; } else { - V.lastWeeksRepErrors.push(`Unknown place "${what}" gained you ${repFormat(rep)}`); + V.lastWeeksRepErrors.push(`Unknown place "${what}" gained you ${rep}`); } } else if (rep < 0) { // EXPENSES // record the action if (typeof V.lastWeeksRepExpenses[what] !== 'undefined') { V.lastWeeksRepExpenses[what] += rep; } else { - V.lastWeeksRepErrors.push(`Unknown place "${what}" cost you ${repFormat(rep)}`); + V.lastWeeksRepErrors.push(`Unknown place "${what}" cost you ${rep}`); } // record the slave, if available diff --git a/src/js/utilsUnits.js b/src/js/utilsUnits.js index 1082f861a7e56c94d194171c5aa938e09d57db5c..76e56352048feafb3d5e592f6020d62b3bd5767b 100644 --- a/src/js/utilsUnits.js +++ b/src/js/utilsUnits.js @@ -355,45 +355,50 @@ globalThis.cashFormatColor = function(s = 0, invert = false) { /** * Formats the given number as reputation. * - * Positive values returns in green, negative values return in red. * @param {number} s The number to format. - * @returns {string} Returns a given number of reputation as a string. + * @param {boolean} [fuzzy] Only show an approximate value. + * @returns {string} Returns a string of the number formatted as a currency. */ -globalThis.repFormat = function(s = 0) { - if (V.cheatMode === 1 || V.debugMode === 1) { - if (s > 0) { - return `<span class="green">${commaNum(Math.round(s * 100) / 100)} rep</span>`; - } else if (s < 0) { - return `<span class="red">${commaNum(Math.round(s * 100) / 100)} rep</span>`; - } else { - return `${commaNum(Math.round(s * 100) / 100)} rep`; - } +globalThis.repFormat = function(s, fuzzy = true) { + if (!fuzzy || V.cheatMode === 1 || V.debugMode === 1) { + return `${commaNum(Math.round(s * 100) / 100)}`; } else { - /* In order to calculate just how much any one category matters so we can show a "fuzzy" symbolic value to the player, we need to know how "busy" reputation was this week. To calculate this, I ADD income to expenses. Why? 100 - 100 and 10000 - 10000 BOTH are 0, but a +50 event matters a lot more in the first case than the second. I exclude overflow and curving from the calculation because it's not a "real" expense for our purposes, and divide by half just to make percentages a bit easier. */ - let weight = s / (((V.lastWeeksRepIncome.Total - V.lastWeeksRepExpenses.Total) + (V.lastWeeksRepExpenses.overflow + V.lastWeeksRepExpenses.curve)) / 2); + // In order to calculate just how much any one category matters, so we can show a "fuzzy" symbolic value to the + // player, we need to know how "busy" reputation was this week. To calculate this, I ADD income to expenses. + // Why? 100 - 100 and 10000 - 10000 BOTH are 0, but a +50 event matters a lot more in the first case than the + // second. I exclude overflow and curving from the calculation because it's not a "real" expense for our + // purposes, and divide by half just to make percentages a bit easier. + // Curving is recorded on the income to keep the numbers correct. + const cleanGain = V.lastWeeksRepIncome.Total + V.lastWeeksRepIncome.curve; + const cleanLoss = V.lastWeeksRepExpenses.Total + V.lastWeeksRepExpenses.overflow; + const movement = cleanGain - cleanLoss; + const weight = s / Math.abs(movement / 2); + // \u2212 = Mathematical minus sign + let r; if (weight > 0.60) { - return `<span class="green">+++++ rep</span>`; + r = `+++++`; } else if (weight > 0.45) { - return `<span class="green">++++ rep</span>`; + r = `++++`; } else if (weight > 0.30) { - return `<span class="green">+++ rep</span>`; + r = `+++`; } else if (weight > 0.15) { - return `<span class="green">++ rep</span>`; + r = `++`; } else if (weight > 0.0) { - return `<span class="green">+ rep</span>`; + r = `+`; } else if (weight === 0) { - return "0 rep"; + r = "0"; } else if (weight < -0.60) { - return `<span class="red">−−−−− rep</span>`; + r = "\u2212\u2212\u2212\u2212\u2212"; } else if (weight < -0.45) { - return `<span class="red">−−−− rep</span>`; + r = `\u2212\u2212\u2212\u2212`; } else if (weight < -0.30) { - return `<span class="red">−−− rep</span>`; + r = `\u2212\u2212\u2212`; } else if (weight < -0.15) { - return `<span class="red">−− rep</span>`; + r = `\u2212\u2212`; } else if (weight < 0) { - return `<span class="red">− rep</span>`; + r = `\u2212`; } + return r; } };