diff --git a/src/gui/css/mainStyleSheet.css b/src/gui/css/mainStyleSheet.css index 6df18302381e551ba35766130030421d7bf9f36e..ea810776e556246be27260e75ebe1efc1403990f 100644 --- a/src/gui/css/mainStyleSheet.css +++ b/src/gui/css/mainStyleSheet.css @@ -339,7 +339,7 @@ div.double-choices, p.double-choices { font-style: italic; } -.story-label { +.story-label, .underline { text-decoration: underline; } diff --git a/src/js/slaveExpenses.js b/src/js/slaveExpenses.js new file mode 100644 index 0000000000000000000000000000000000000000..9327b167f0a27bd01feb87deb0025fc4658a47f3 --- /dev/null +++ b/src/js/slaveExpenses.js @@ -0,0 +1,231 @@ +/** + * Returns a block that describes an overview of the slave's impact on your reputation and finances in the short term + * @param {App.Entity.SlaveState} slave + * @returns {node} + */ +globalThis.slaveExpenses = function(slave) { + const frag = new DocumentFragment(); + let div; + + // Generate the lines of the report + for (const line of getSlaveCostArray(slave)) { + div = document.createElement("div"); + div.classList.add("indent"); + App.UI.DOM.appendNewElement("span", div, `${line.text}: `); + App.UI.DOM.appendNewElement("span", div, cashFormat(line.value), "cash"); + frag.append(div); + } + + // Total expenses + const individualCosts = getSlaveCost(slave); + div = document.createElement("div"); + div.classList.add("double-indent"); + + App.UI.DOM.appendNewElement("span", div, "Predicted expense", "underline"); + div.append(": "); + div.append(App.UI.DOM.cashFormat(-individualCosts)); + frag.append(div); + + // Income from last week vs expense gives net, assistant gated + if (V.assistant.power > 0) { + if (slave.lastWeeksCashIncome > 0) { + div = document.createElement("div"); + div.classList.add("indent"); + App.UI.DOM.appendNewElement("span", div, `Income: `); + div.append(App.UI.DOM.cashFormat(slave.lastWeeksCashIncome)); + frag.append(div); + + div = document.createElement("div"); + div.classList.add("double-indent"); + App.UI.DOM.appendNewElement("span", div, `Total`, "underline"); + App.UI.DOM.appendNewElement("span", div, `: `); + div.append(App.UI.DOM.cashFormat(slave.lastWeeksCashIncome - individualCosts)); + frag.append(div); + } + } + frag.append(slaveImpactLongTerm(slave)); + + return frag; +}; + +/** + * Returns a block that describes an overview of the slave's impact on your reputation and finances over the long term + * @param {App.Entity.SlaveState} slave + * @returns {node} + */ +globalThis.slaveImpactLongTerm = function(slave) { + const frag = new DocumentFragment(); + const {he, his, him} = getPronouns(slave); + let p; + let div; + let span; + let _Cost; + let _Expense; + let _Income; + let text; + + // Background and original cost + if (slave.origin !== 0) { + App.UI.DOM.appendNewElement("div", frag, pronounsForSlaveProp(slave, slave.origin), "indent"); + } + div = document.createElement("div"); + div.classList.add("indent"); + if (slave.slaveCost < 0) { + div.append(`You bought ${him} for: `); + div.append(App.UI.DOM.cashFormat(slave.slaveCost)); + div.append(`.`); + _Cost = slave.slaveCost; + } else if (slave.slaveCost === 0) { + div.append(`You spent nothing to acquire ${him}.`); + _Cost = slave.slaveCost; + } else { + text = `You have no record of how much `; + if (slave.origin !== 0) { + text += `this`; + } else { + text += `${he} originally`; + } + text += ` cost.`; + div.append(text); + _Cost = 0; + } + frag.append(div); + + // Lifetime totals, assistant gated + if (V.assistant.power > 0) { + const _weeksOwned = V.week - slave.weekAcquired; + // Lifetime expense + div = document.createElement("div"); + div.classList.add("indent"); + if (slave.lifetimeCashExpenses < 0) { + text = `In ${his} `; + if (_weeksOwned > 0) { + text += `${_weeksOwned} `; + if (_weeksOwned === 1) { + text += `week`; + } else { + text += `weeks`; + } + } else { + text += `time`; + } + text += ` with you, ${he} has cost `; + div.append(text); + div.append(App.UI.DOM.cashFormat(slave.lifetimeCashExpenses)); + div.append(`.`); + _Expense = slave.lifetimeCashExpenses; + } else { + div.append(`You have no record of ${him} costing you any ¤.`); + _Expense = 0; + } + frag.append(div); + + // Lifetime income + div = document.createElement("div"); + div.classList.add("indent"); + if (slave.lifetimeCashIncome > 0) { + text = `In ${his} `; + if (_weeksOwned > 0) { + text += `${_weeksOwned} `; + if (_weeksOwned === 1) { + text += `week`; + } else { + text += `weeks`; + } + } else { + text += `time`; + } + text += ` with you, ${he} has earned `; + div.append(text); + div.append(App.UI.DOM.cashFormat(slave.lifetimeCashIncome)); + div.append(`.`); + _Income = slave.lifetimeCashIncome; + } else { + div.append(`You have no record of ${him} making you any ¤.`); + _Income = 0; + } + frag.append(div); + + // Lifetime total + div = document.createElement("div"); + div.classList.add("indent"); + div.append(`Overall, `); + if ((_Income + _Cost + _Expense) > 0) { + div.append(`you have made `); + div.append(App.UI.DOM.cashFormat(_Income + _Cost + _Expense)); + div.append(` net from ${his} labors.`); + } else if ((_Income + _Cost + _Expense) === 0) { + div.append(`${he} is even in cost and income.`); + } else { + div.append(`${he} has cost you `); + div.append(App.UI.DOM.cashFormat(_Income + _Cost + _Expense)); + div.append(`.`); + } + frag.append(div); + + // Reputation: + p = document.createElement("p"); + if (slave.lifetimeRepIncome !== 0 || slave.lifetimeRepExpenses !== 0) { + let _repTotal = (slave.lifetimeRepIncome + slave.lifetimeRepExpenses); + if (V.cheatMode === 1 || V.debugMode === 1) { + if (slave.lifetimeRepIncome !== 0) { + div = document.createElement("div"); + div.classList.add("indent"); + div.append(`This week ${he} has `); + if (slave.lastWeeksRepIncome === 0) { + div.append(`had no positive effect on your reputation, but `); + } else { + div.append(`improved your reputation by `); + App.UI.DOM.appendNewElement("span", div, num(slave.lastWeeksRepIncome), "green"); + div.append(` and `); + } + div.append(`over ${his} entire time with you, ${he} gained `); + App.UI.DOM.appendNewElement("span", div, `${num(slave.lifetimeRepIncome)}.`, "green"); + p.append(div); + } + + if (slave.lifetimeRepExpenses !== 0) { + div = document.createElement("div"); + div.classList.add("indent"); + div.append(`This week ${he} has `); + if (slave.lastWeeksRepExpenses === 0) { + div.append(`had no negative effect on your reputation, but `); + } else { + div.append(`lowered your reputation by `); + App.UI.DOM.appendNewElement("span", div, slave.lastWeeksRepExpenses, "red"); + div.append(` and `); + } + div.append(`over ${his} entire time with you, ${he} cost `); + App.UI.DOM.appendNewElement("span", div, `${slave.lifetimeRepExpenses}.`, "red"); + p.append(div); + } + + div = document.createElement("div"); + div.classList.add("indent"); + div.append(`Overall then, ${he} has changed your reputation by `); + span = document.createElement("span"); + if (_repTotal > 0) { + span.classList.add("green"); + } else if (_repTotal < 0) { + span.classList.add("red"); + } + span.append(num(_repTotal)); + div.append(span); + p.append(div); + } else { + /* lowercasedonkey: TODO: I don't like how vague my placeholder is. Probably need to set up some kind of sliding scale to describe how much rep (roughly) she has made or lost. Need to get a sense of common ranges. */ + text = `Overall, ${he} has `; + if (_repTotal === 0) { + text += `had no impact on your reputation.`; + } else if (_repTotal > 0) { + text += `<span class="green">increased</span> your reputation.`; + } else if (_repTotal < 0) { + text += `<span class="red">decreased</span> your reputation.`; + } + App.UI.DOM.appendNewElement("div", p, text, "indent"); + } + } + frag.append(p); + } + return frag; +}; diff --git a/src/js/utilsDOM.js b/src/js/utilsDOM.js index 27531125aa81bb12b0711a878886f59807ec5109..efd222f544541de35cd3d3df43b596a2aab60db1 100644 --- a/src/js/utilsDOM.js +++ b/src/js/utilsDOM.js @@ -382,3 +382,14 @@ Macro.add("includeDOM", { } } }); + +App.UI.DOM.cashFormat = function(s) { + const span = document.createElement("span"); + if (s < 0) { // Display red if the value is negative, unless invert is true + span.classList.add("red"); + } else if (s !== 0) { // Yellow for positive + span.classList.add("cash"); + } + span.textContent = cashFormat(Math.trunc(s)); + return span; +}; diff --git a/src/uncategorized/costsReport.tw b/src/uncategorized/costsReport.tw index f971c456965480b4182a2adfa960e35b175656df..5b365daa246306f026575687ddd11c9cb3f83d64 100644 --- a/src/uncategorized/costsReport.tw +++ b/src/uncategorized/costsReport.tw @@ -7,7 +7,7 @@ <<capture $i>> <br style="clear:both"><<if $lineSeparations == 0>><br><<else>><hr style="margin:0"><</if>> [[$slaves[$i].slaveName|Slave Interact][$activeSlave = $slaves[$i]]] will $slaves[$i].assignment. - <<SlaveExpenses $slaves[$i]>> + <<includeDOM SlaveExpenses (V.slaves[V.i])>> <</capture>> <</for>> diff --git a/src/uncategorized/costsReportSlaves.tw b/src/uncategorized/costsReportSlaves.tw index 3399fecd92dfe8a6509c01412263bd4e8a05718d..ae0467edc474f629deb9c74255662f840c8890c3 100644 --- a/src/uncategorized/costsReportSlaves.tw +++ b/src/uncategorized/costsReportSlaves.tw @@ -8,6 +8,6 @@ <<capture $i>> <br style="clear:both"><<if $lineSeparations == 0>><br><<else>><hr style="margin:0"><</if>> [[$slaves[$i].slaveName|Slave Interact][$activeSlave = $slaves[$i]]] will $slaves[$i].assignment. - <<SlaveExpenses $slaves[$i]>> + <<includeDOM SlaveExpenses (V.slaves[V.i])>> <</capture>> <</for>> diff --git a/src/uncategorized/costsWidgets.tw b/src/uncategorized/costsWidgets.tw deleted file mode 100644 index 5b69bd2fa6c132cb49c48e662134f34ac6c0190a..0000000000000000000000000000000000000000 --- a/src/uncategorized/costsWidgets.tw +++ /dev/null @@ -1,145 +0,0 @@ -:: Cost widgets [nobr widget] - -<<widget "SlaveExpenses">> - <<set _individualCosts = 0>> - <<setLocalPronouns $args[0]>> - - /* Generate the lines of the report */ - <<for _line range getSlaveCostArray($args[0])>> - <div class="indent"> - <<= _line.text>>: <<=cashFormatColor(_line.value)>> - </div> - <</for>> - - /* Total expenses */ - <<set _individualCosts = Math.trunc(getSlaveCost($args[0]))>> - <div class="double-indent"> - __Predicted expense__: @@.red;<<print cashFormat(Math.trunc(_individualCosts))>>@@ - </div> - - /* Income from last week vs expense gives net, assistant gated */ - <<if $assistant.power > 0>> - <<if $args[0].lastWeeksCashIncome > 0>> - <div class="indent"> - Income: <<print cashFormatColor($args[0].lastWeeksCashIncome)>> - </div> - <<set _total = (Math.trunc($args[0].lastWeeksCashIncome - _individualCosts))>> - <div class="double-indent"> - __Total__: <<print cashFormatColor(Math.trunc(_total))>> - </div> - <</if>> - <</if>> - <<SlaveExpensesExtra $args[0]>> -<</widget>> - -<<widget "SlaveExpensesExtra">> - <<setLocalPronouns $args[0]>> - /* Background and original cost */ - <<if $args[0].origin != 0>> - <div class="indent"> - $args[0].origin - </div> - <</if>> - <div class="indent"> - <<if $args[0].slaveCost < 0>> - You bought $him for: @@.red;<<print cashFormat($args[0].slaveCost)>>.@@ - <<set _Cost = $args[0].slaveCost>> - <<elseif $args[0].slaveCost == 0>> - You spent nothing to acquire $him. - <<set _Cost = $args[0].slaveCost>> - <<else>> - You have no record of how much <<if $args[0].origin != 0>>this<<else>>$he originally<</if>> cost. - <<set _Cost = 0>> - <</if>> - </div> - - /* Lifetime totals, assistant gated */ - <<if $assistant.power > 0>> - <<set _weeksOwned = $week - $args[0].weekAcquired>> - /* Lifetime expense */ - <div class="indent"> - <<if $args[0].lifetimeCashExpenses < 0>> - In $his <<if _weeksOwned > 0>>_weeksOwned <<if _weeksOwned == 1>>week<<else>>weeks<</if>><<else>>time<</if>> with you, $he has cost @@.red;<<print cashFormat($args[0].lifetimeCashExpenses)>>.@@ - <<set _Expense = $args[0].lifetimeCashExpenses>> - <<else>> - You have no record of $him costing you any ¤. - <<set _Expense = 0>> - <</if>> - </div> - - /* Lifetime income */ - <div class="indent"> - <<if $args[0].lifetimeCashIncome > 0>> - In $his <<if _weeksOwned > 0>>_weeksOwned <<if _weeksOwned == 1>>week<<else>>weeks<</if>><<else>>time<</if>> with you, $he has earned @@.yellowgreen;<<print cashFormat($args[0].lifetimeCashIncome)>>.@@ - <<set _Income = $args[0].lifetimeCashIncome>> - <<else>> - You have no record of $him making you any ¤. - <<set _Income = 0>> - <</if>> - </div> - - /* Lifetime total */ - <div class="indent"> - Overall, - <<if (_Income + _Cost + _Expense) > 0>> - you have made @@.yellowgreen;<<print cashFormat(_Income + _Cost + _Expense)>>@@ net from $his labors. - <<elseif (_Income + _Cost + _Expense) == 0>> - $he is even in cost and income. - <<else>> - $he has cost you @@.red;<<print cashFormat(_Income + _Cost + _Expense)>>.@@ - <</if>> - </div> - - /* Reputation: */ - <div> - <<if ($args[0].lifetimeRepIncome != 0 || $args[0].lifetimeRepExpenses != 0)>> - <<set _repTotal = ($args[0].lifetimeRepIncome + $args[0].lifetimeRepExpenses)>> - <<if ($cheatMode == 1 || $debugMode == 1)>> - <<if $args[0].lifetimeRepIncome != 0>> - <div class="indent"> - This week $he has - <<if $args[0].lastWeeksRepIncome == 0>> - had no positive effect on your reputation, but - <<else>> - improved your reputation by @@.green;<<print num($args[0].lastWeeksRepIncome)>>@@ and - <</if>> - over $his entire time with you, $he gained @@.green;<<print num($args[0].lifetimeRepIncome)>>.@@ - </div> - <</if>> - <<if $args[0].lifetimeRepExpenses != 0>> - <div class="indent"> - This week $he has - <<if $args[0].lastWeeksRepExpenses == 0>> - had no negative effect on your reputation, but - <<else>> - lowered your reputation by @@.red;<<print num($args[0].lastWeeksRepExpenses)>>@@ and - <</if>> - over $his entire time with you, $he cost @@.red;<<print num($args[0].lifetimeRepExpenses)>>.@@ - </div> - <</if>> - <div class="indent"> - Overall then, $he has changed your reputation by - <<if _repTotal > 0>> - @@.green;<<print num(_repTotal)>>@@ - <<elseif _repTotal < 0>> - @@.red;<<print num(_repTotal)>>@@ - <<else>> - <<print num(_repTotal)>> - <</if>> - </div> - <<else>> /* lowercasedonkey: TODO: I don't like how vague my placeholder is. Probably need to set up some kind of sliding scale to describe how much rep (roughly) she has made or lost. Need to get a sense of common ranges. */ - <div class="indent"> - Overall, $he has - <<if _repTotal == 0>> - had no impact on your reputation. - <<elseif _repTotal > 0>> - @@.green;increased@@ your reputation. - <<elseif _repTotal < 0>> - @@.red;decreased@@ your reputation. - <</if>> - </div> - <</if>> - <</if>> - </div> - <</if>> -<</widget>> diff --git a/src/uncategorized/pBioreactorPerfected.tw b/src/uncategorized/pBioreactorPerfected.tw index 6400df20ac5ace1511c5831d8294429a6fb33718..68a0cc811044ded79c58461d98a6dc3d886ee756 100644 --- a/src/uncategorized/pBioreactorPerfected.tw +++ b/src/uncategorized/pBioreactorPerfected.tw @@ -238,6 +238,6 @@ You stop and consider the cow, from $his titanic breasts to $his <<if ($activeSl <div class="indent"> $His current task is to <<print $activeSlave.assignment>><<if $assignmentRecords[$activeSlave.ID]>>, and before that to <<print $assignmentRecords[$activeSlave.ID]>><</if>>. </div> - <<SlaveExpenses $activeSlave>> + <<includeDOM slaveExpenses(V.activeSlave)>> </div> <</if>> /* closes validity check */ diff --git a/src/uncategorized/pMercenaryRomeo.tw b/src/uncategorized/pMercenaryRomeo.tw index e44f9645d50b45dcfa4fc73f8adf1528ecce805f..f0e7363898e764ce86bd6cf5f00c083ef57a6d13 100644 --- a/src/uncategorized/pMercenaryRomeo.tw +++ b/src/uncategorized/pMercenaryRomeo.tw @@ -132,7 +132,7 @@ proffered by an attentive slave _girlU, he seems almost bashful. <div class="indent"> $His current task is to <<print $activeSlave.assignment>><<if $assignmentRecords[$activeSlave.ID]>>, and before that to <<print $assignmentRecords[$activeSlave.ID]>><</if>>. </div> - <<SlaveExpensesExtra $activeSlave>> + <<includeDOM slaveImpactLongTerm(V.activeSlave)>> </div> <</if>> diff --git a/src/uncategorized/seExpiration.tw b/src/uncategorized/seExpiration.tw index 6a5d5cc47662078b2e137cf10c2d2618190034ab..df473743b1d393701a3decff38957bc84caf4085 100644 --- a/src/uncategorized/seExpiration.tw +++ b/src/uncategorized/seExpiration.tw @@ -202,5 +202,5 @@ at the moment of $his scheduled emancipation, $he seems willing to consider a sh <div class="indent"> $His most recent task was to <<print $activeSlave.assignment>><<if $assignmentRecords[$activeSlave.ID]>>, and before that to <<print $assignmentRecords[$activeSlave.ID]>><</if>>. </div> - <<SlaveExpensesExtra $activeSlave>> + <<includeDOM slaveImpactLongTerm(V.activeSlave)>> </div> \ No newline at end of file diff --git a/src/uncategorized/seRetirement.tw b/src/uncategorized/seRetirement.tw index 560bf85bcb33e1af1f5307509444a958e7b0726c..c38103479688aa2a09fe03b2a6431168674a2252 100644 --- a/src/uncategorized/seRetirement.tw +++ b/src/uncategorized/seRetirement.tw @@ -388,7 +388,7 @@ <div class="indent"> $His most recent task was to <<print $activeSlave.assignment>><<if $assignmentRecords[$activeSlave.ID]>>, and before that to <<print $assignmentRecords[$activeSlave.ID]>><</if>>. </div> - <<SlaveExpensesExtra $activeSlave>> + <<includeDOM slaveImpactLongTerm(V.activeSlave)>> </div> <<if $retired == 0>> /* retiring during the end week */ diff --git a/src/uncategorized/sellSlave.tw b/src/uncategorized/sellSlave.tw index 4f3cf2cec05a3151f1d9ffef912f17d8df843cc7..0007e6b30a74a330ead71c95a2d5f4ee14e0c042 100644 --- a/src/uncategorized/sellSlave.tw +++ b/src/uncategorized/sellSlave.tw @@ -728,7 +728,7 @@ A reputable slave appraiser arrives promptly to inspect $him and certify $his qu <br><br> __Financial Records__ -<<SlaveExpenses $activeSlave>> +<<includeDOM slaveExpenses(V.activeSlave)>> <</if>> /* CLOSES APPRAISAL */ <</if>> /* closes breeding mark */ diff --git a/src/uncategorized/slaveInteract.tw b/src/uncategorized/slaveInteract.tw index 46ba3454f437d529763d019fea65732ac0a5acd0..b1e4f5796a89830351634b5ffd4e35321cfaa205 100644 --- a/src/uncategorized/slaveInteract.tw +++ b/src/uncategorized/slaveInteract.tw @@ -324,7 +324,7 @@ <h3>Financial</h3> <p> - <<SlaveExpenses $activeSlave>> + <<includeDOM slaveExpenses(V.activeSlave)>> </p> <p>