Skip to content
Snippets Groups Projects
Commit 9874b335 authored by svornost's avatar svornost
Browse files

Move corp ledger to DOM (and fix that startup error)

parent a32b643b
No related branches found
No related tags found
No related merge requests found
Macro.add('scope', {
skipArgs : true,
tags : null,
handler() {
const oldTemporary = State.temporary;
const restoreOldTemporary = function() {
let keys = Object.keys(oldTemporary);
for(let i=0; i<keys.length; ++i) {
let key = keys[i];
let obj = oldTemporary[key];
State.temporary[key] = obj;
}
};
let keepOverwrites = false;
try {
State.clearTemporary();
if(/^\s*as\s+child\s*$/.test(this.args.raw)) {
restoreOldTemporary();
keepOverwrites = true;
} else {
const varRe = new RegExp(`(${Patterns.variable})`, 'g');
let match;
/*
Cache the existing values of the variables and add a shadow.
*/
while ((match = varRe.exec(this.args.raw)) !== null) {
const varName = match[1];
const varKey = varName.slice(1);
if(varName[0] === '$') {
return this.error("Global variable '" + varName + "'cannot be scoped.");
}
if (!oldTemporary.hasOwnProperty(varKey)) {
continue;
}
State.temporary[varKey] = oldTemporary[varKey];
}
}
new Wikifier(this.output, this.payload[0].contents.trim());
} finally {
if(!keepOverwrites) {
State.clearTemporary();
restoreOldTemporary();
} else {
const overwrites = State.temporary;
State.clearTemporary();
let keys = Object.keys(oldTemporary);
for(let i=0; i<keys.length; ++i) {
let key = keys[i];
let obj = overwrites[key];
State.temporary[key] = obj;
}
}
}
}
});
...@@ -60,7 +60,6 @@ App.Corporate.Init = function() { ...@@ -60,7 +60,6 @@ App.Corporate.Init = function() {
constructor(corp, suffix="") { constructor(corp, suffix="") {
this.corp = corp; this.corp = corp;
this.suffix = suffix; this.suffix = suffix;
this.clear();
} }
get operations( ) { return this.getStored('OpCost'); } get operations( ) { return this.getStored('OpCost'); }
set operations(value) { this.setStored('OpCost', value); } set operations(value) { this.setStored('OpCost', value); }
...@@ -900,13 +899,6 @@ App.Corporate.Init = function() { ...@@ -900,13 +899,6 @@ App.Corporate.Init = function() {
c.economicBoost = 0; c.economicBoost = 0;
} }
}; };
if(V.corp.DivTrainSurgeryTimer !== undefined) {
let timer = V.corp.DivTrainSurgeryTimer;
// Note: originally the timer was capped at 20, so the founding week isn't guaranteed to be correct.
V.corp.DivSurgeryFounded = V.week - timer;
delete V.corp.DivTrainSurgeryTimer;
}
}; };
......
/** Create the DOM ledger table
* @param {object} ledger - One of the members of App.Corporate.ledger, such as .current or .old
* @param {number} week - Week number (usually V.week, for the current ledger, or V.week-1, for the old one)
* @returns {HTMLTableElement}
*/
App.Corporate.writeLedger = function(ledger, week) {
/** Add a row to the ledger
* @param {HTMLElement} table
* @param {string} cellType
* @param {string} caption
* @param {number} [value]
* @param {string|Node} [note]
*/
function createRow(table, cellType, caption, value, note) {
const row = App.UI.DOM.appendNewElement("tr", table);
/** @type {HTMLTableCellElement} */
const leftCell = App.UI.DOM.appendNewElement(cellType, row, caption);
if (jsDef(value)) {
const rightCell = App.UI.DOM.appendNewElement(cellType, row, App.UI.DOM.makeElement("div", formatCash(value)));
if (note) {
App.UI.DOM.appendNewElement("div", rightCell, note, "minor-note");
}
} else {
leftCell.colSpan = 2;
}
}
/** Format cash with color, DOM style (probably should be a shared function)
* @param {number} cash
* @returns {HTMLSpanElement}
*/
function formatCash(cash) {
let span = App.UI.DOM.makeElement('span', cashFormat(cash));
if (cash === 0) {
span.classList.add("gray");
} else {
span.classList.add("cash");
if (cash < 0) {
span.classList.add("dec");
} else if (cash > 0) {
span.classList.add("inc");
}
}
return span;
}
/** Build the cheat textbox for liquidity
* @param {number} cash - initial value
* @returns {HTMLInputElement}
*/
function makeCheatTextbox(cash) {
return App.UI.DOM.makeTextBox(cash, (v) => {
App.Corporate.cheatCash(v);
updateLedgerTable();
}, true);
}
function buildLedgerTable() {
const table = document.createElement('table');
table.className = "corporate";
table.id = "corporate-ledger";
const thead = App.UI.DOM.appendNewElement('thead', table);
createRow(thead, "th", `Ledger for ${asDateString(week)} - ${asDateString(week + 1)}`);
const tbody = App.UI.DOM.appendNewElement('tbody', table);
createRow(tbody, "td", "Revenue", ledger.revenue);
if (V.cheatMode && ledger.foreignRevenue > 0) {
createRow(tbody, "td", "Including Neighbor Bonus", ledger.foreignRevenue);
}
createRow(tbody, "td", "Operating Expenses", forceNeg(ledger.operations));
createRow(tbody, "td", "Slave Expenses", forceNeg(ledger.slaves));
createRow(tbody, "td", "Asset Expenses", forceNeg(ledger.development));
if (V.cheatMode) {
createRow(tbody, "td", `Economic ${ledger.economicBoost < 0 ? "Expenses" : "Windfall"}`, ledger.economicBoost);
}
createRow(tbody, "td", "Overhead", forceNeg(ledger.overhead));
let econNote = '';
if (ledger.economy > 100) {
econNote = "* Profits benefited from a strong economy.";
} else if (ledger.economy > 60) {
econNote = "* Profits were lowered by the weak economy.";
} else {
econNote = "* Profits were severely depressed by the failing economy.";
}
createRow(tbody, "td", "Profit", ledger.profit, econNote);
createRow(tbody, "th", "Totals");
createRow(tbody, "td", "Liquidity", App.Corporate.cash, V.cheatMode ? makeCheatTextbox(App.Corporate.cash) : undefined);
createRow(tbody, "td", "Corporate Value", App.Corporate.value);
createRow(tbody, "td", "Dividend for Payout", App.Corporate.dividend, `Pays out on ${asDateString(V.week + App.Corporate.dividendTimer, -1)},
${App.Corporate.dividendTimer === 1 ? `the end of this week` : `in ${App.Corporate.dividendTimer} weeks`}
`);
return table;
}
function updateLedgerTable() {
$('#corporate-ledger').replaceWith(buildLedgerTable());
}
return buildLedgerTable();
};
:: corporate widgets [widget nobr]
/*
Usage:
<<CorporateLedger _ledger $week>>
_ledger: One of the members of App.Corporate.ledger, such as .current or .old
$week: The current week or the previous week, depending on whether you used current or old.
*/
<<widget "CorporateLedger">>
<<scope>>
<<set _ledger = $args[0]>>
<<set _week = $args[1]>>
<table class="corporate">
<thead>
<tr><th colspan="2">Ledger for <<= asDateString(_week) >> - <<= asDateString(_week + 1, -1) >></th></tr>
</thead>
<tbody>
/*Returns last week's revenue, gets calculated in corporationDevelopments, but slaves sold here also added to it for next week*/
<tr><td>Revenue</td><td><<= cashFormatColor(_ledger.revenue)>></td></tr>
<<if ($cheatMode) && ($cheatModeM) && App.Corporate.foreignRevenue > 0>>
<tr><td>Including Neighbor Bonus</td><td><<= cashFormatColor(_ledger.foreignRevenue)>></td></tr>
<</if>>
/*Just like revenue, except for operating expenses (all calculated in corporationDevelopments)*/
<tr><td>Operating Expenses</td><td><<= cashFormatColor(_ledger.operations, true)>></td></tr>
/*buying slaves to work on adds to this expense, works just like revenue*/
<tr><td>Slave Expenses</td><td><<= cashFormatColor(_ledger.slaves, true)>></td></tr>
/*costs associated with expanding divisions end up here, reports costs from last week, not current*/
<tr><td>Asset Expenses</td><td><<= cashFormatColor(_ledger.development, true)>></td></tr>
<<if ($cheatMode) && ($cheatModeM)>>
<tr>
<td>Economic <<if _ledger.economicBoost < 0>>Expenses<<else>>Windfall<</if>></td>
<td><<= cashFormatColor(_ledger.economicBoost)>></td>
</tr>
<</if>>
<tr><td>Overhead</td><td><<= cashFormatColor(_ledger.overhead, true)>></td></tr>
<tr><td>Profit</td><td>
<div><<= cashFormatColor(_ledger.profit)>></div>
<<if _ledger.economicBoost > 0>>
<div class="minor-note">
<<if _ledger.economy > 100>>
* Profits benefited from a strong economy.
<<elseif _ledger.economy > 60>>
* Profits were lowered by the weak economy.
<<else>>
* Profits were severely depressed by the failing economy.
<</if>>
</div>
<</if>>
</td></tr>
</tbody>
<thead>
<tr><th colspan="2">Totals</th></tr>
</thead>
<tbody>
<tr>
<td>Liquidity</td>
<td>
<<if ($cheatMode) && ($cheatModeM)>>
<span id="corp-cash"><<= cashFormatColor(App.Corporate.cash)>></span>
<<set _tCorpCash = App.Corporate.cash>>
<<textbox "_tCorpCash" _tCorpCash>>
<<link "Apply">>
<<set App.Corporate.cheatCash(_tCorpCash)>>
<<replace "#corp-cash">><<= cashFormatColor(App.Corporate.cash)>><</replace>>
<</link>>
<<else>>
<<= cashFormatColor(App.Corporate.cash)>>
<</if>>
</td>
</tr>
<tr><td>Corporate Value</td><td><<= cashFormatColor(App.Corporate.value)>></td></tr>
<tr>
<td>Dividend for Payout</td>
<td>
<div><<= cashFormatColor(App.Corporate.dividend)>></div>
<div class="minor-note">Pays out on <<=asDateString($args[1] + App.Corporate.dividendTimer, -1)>>, <<if App.Corporate.dividendTimer == 1>>
the end of this week
<<else>>
in <<= App.Corporate.dividendTimer >> weeks
<</if>>
</div>
</td></tr>
</tbody>
</table>
<</scope>>
<</widget>>
...@@ -10,7 +10,6 @@ ...@@ -10,7 +10,6 @@
<h2>Operational Results</h2> <h2>Operational Results</h2>
/*Divisions doing their thing*/ /*Divisions doing their thing*/
<<set _weekLedger = App.Corporate.endWeek()>> <<set _weekLedger = App.Corporate.endWeek()>>
/* TODO: I would like to move some of the following loop into a new loop. It should go Process -> Transfer -> Sell -> Buy (most expensive to least) to give the best chance of auto-buy having enough money to make purchases. */
<<for _d range _weekLedger.divisionLedgers>> <<for _d range _weekLedger.divisionLedgers>>
<<set _div = _d.division>> <<set _div = _d.division>>
/* Reporting on number of slaves being processed or completed processing */ /* Reporting on number of slaves being processed or completed processing */
...@@ -53,8 +52,7 @@ ...@@ -53,8 +52,7 @@
<</for>> <</for>>
/*Aggregate Corporation Results*/ /*Aggregate Corporation Results*/
<<set _ledger = App.Corporate.ledger.current>>/*Note: You can't just pass the object directly into a widget. */ <<includeDOM App.Corporate.writeLedger(App.Corporate.ledger.current, $week)>>
<<CorporateLedger _ledger $week>>
/*Division Expansion Tokens*/ /*Division Expansion Tokens*/
<<if _weekLedger.canExpandNow>> <<if _weekLedger.canExpandNow>>
......
...@@ -61,9 +61,7 @@ ...@@ -61,9 +61,7 @@
<<if App.Corporate.foundedDate>> <<if App.Corporate.foundedDate>>
<div class="founding">Founded on <<= asDateString(App.Corporate.foundedDate)>></div> <div class="founding">Founded on <<= asDateString(App.Corporate.foundedDate)>></div>
<</if>> <</if>>
<<set _ledger = App.Corporate.ledger.old>>/*You can't pass the object directly into the widget. */ <<includeDOM App.Corporate.writeLedger(App.Corporate.ledger.old, $week-1)>>
<<set _lastWeek = $week - 1>>
<<CorporateLedger _ledger _lastWeek>>
<h1>Division Management</h1> <h1>Division Management</h1>
<<for _div range App.Corporate.divisionList.filter(x => x.founded)>> <<for _div range App.Corporate.divisionList.filter(x => x.founded)>>
......
...@@ -255,6 +255,10 @@ table.corporate tbody tr:nth-child(odd) { ...@@ -255,6 +255,10 @@ table.corporate tbody tr:nth-child(odd) {
table.corporate td { table.corporate td {
vertical-align: top; vertical-align: top;
} }
table.corporate tbody th, table.corporate thead th {
background-color: black;
font-weight: bold;
}
.minor-note { .minor-note {
font-size: 0.75em; font-size: 0.75em;
font-style: italic; font-style: italic;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment