🏠 Home 

War Value Calculator

Add a damage inflicted value table to war timelines


Install this script?
// ==UserScript==
// @name         War Value Calculator
// @namespace    http://www.knightsradiant.pw
// @version      0.51
// @description  Add a damage inflicted value table to war timelines
// @author       Talus
// @match        https://politicsandwar.com/nation/war/timeline*
// @require      https://code.jquery.com/jquery-3.6.0.min.js
// @license      GPL-3.0-or-later
// @grant        none
// ==/UserScript==
(function(){
var $ = window.jQuery;
var resourceValues = JSON.parse(localStorage.getItem('resourceValues'));
if (resourceValues == null) {
alert('Visit the trades page to update resource values used for loss calculations.');
return;
}
var agressorValues = getAgressorValues($);
var defenderValues = getDefenderValues($);
var agressorMoney = getMoney(agressorValues, defenderValues, resourceValues);
var agressorNet = getNet(agressorMoney);
var defenderMoney = getMoney(defenderValues, agressorValues, resourceValues);
var defenderNet = getNet(defenderMoney);
var totalLoses = -(agressorNet + defenderNet);
var winnerNet = Math.abs(agressorNet - defenderNet);
for (const property in agressorMoney) {
agressorMoney[property] = agressorMoney[property].toLocaleString(undefined, {minimumFractionDigits:2});
}
for (const property in defenderMoney) {
defenderMoney[property] = defenderMoney[property].toLocaleString(undefined, {minimumFractionDigits:2});
}
//writeR###ltsToConsole(agressorMoney, agressorNet, defenderMoney, defenderNet, totalLoses, winnerNet);
addR###ltsToPage($, agressorMoney, agressorNet, defenderMoney, defenderNet, totalLoses, winnerNet);
})();
function getAgressorValues($) {
let agressorPaths = {
infrastructureDestroyedValue: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(3) > td:nth-child(2)',
moneyStolen: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(4) > td:nth-child(2)',
soldiersKilled: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(5) > td:nth-child(2)',
####sDestroyed: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(6) > td:nth-child(2)',
aircraftDestroyed: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(7) > td:nth-child(2)',
shipsDestroyed: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(8) > td:nth-child(2)',
missilesLaunched: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(9) > td:nth-child(2)',
nukesLaunched: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(11) > td:nth-child(2)',
munitionsUsed: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(13) > td:nth-child(2)',
gasolineUsed: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(14) > td:nth-child(2)',
steelUsed: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(15) > td:nth-child(2)',
aluminumUsed: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(16) > td:nth-child(2)',
aircraftDestroyedGround: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(21) > td:nth-child(2)',
soldiersKilledAir: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(22) > td:nth-child(2)',
####sDestroyedAir: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(23) > td:nth-child(2)',
shipsDestroyedAir: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(24) > td:nth-child(2)',
moneyDestroyedAir: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(25) > td:nth-child(2)'
};
return {
infrastructureDestroyedValue: Number($(agressorPaths.infrastructureDestroyedValue).text().replace('$','').replaceAll(',','')),
moneyStolen: Number($(agressorPaths.moneyStolen).text().replace('$','').replaceAll(',','')),
soldiersKilled: Number($(agressorPaths.soldiersKilled).text().replaceAll(',','')),
####sDestroyed: Number($(agressorPaths.####sDestroyed).text().replaceAll(',','')),
aircraftDestroyed: Number($(agressorPaths.aircraftDestroyed).text().replaceAll(',','')),
shipsDestroyed: Number($(agressorPaths.shipsDestroyed).text().replaceAll(',','')),
missilesLaunched: Number($(agressorPaths.missilesLaunched).text().replaceAll(',','')),
nukesLaunched: Number($(agressorPaths.nukesLaunched).text().replaceAll(',','')),
munitionsUsed: Number($(agressorPaths.munitionsUsed).text().replaceAll(',','')),
gasolineUsed: Number($(agressorPaths.gasolineUsed).text().replaceAll(',','')),
steelUsed: Number($(agressorPaths.steelUsed).text().replaceAll(',','')),
aluminumUsed: Number($(agressorPaths.aluminumUsed).text().replaceAll(',','')),
aircraftDestroyedGround: Number($(agressorPaths.aircraftDestroyedGround).text().replaceAll(',','')),
soldiersKilledAir: Number($(agressorPaths.soldiersKilledAir).text().replaceAll(',','')),
####sDestroyedAir: Number($(agressorPaths.####sDestroyedAir).text().replaceAll(',','')),
shipsDestroyedAir: Number($(agressorPaths.shipsDestroyedAir).text().replaceAll(',','')),
moneyDestroyedAir: Number($(agressorPaths.moneyDestroyedAir).text().replace('$','').replaceAll(',',''))
};
}
function getDefenderValues($) {
let defenderPaths = {
infrastructureDestroyedValue: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(3) > td:nth-child(3)',
moneyStolen: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(4) > td:nth-child(3)',
soldiersKilled: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(5) > td:nth-child(3)',
####sDestroyed: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(6) > td:nth-child(3)',
aircraftDestroyed: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(7) > td:nth-child(3)',
shipsDestroyed: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(8) > td:nth-child(3)',
missilesLaunched: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(9) > td:nth-child(3)',
nukesLaunched: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(11) > td:nth-child(3)',
munitionsUsed: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(13) > td:nth-child(3)',
gasolineUsed: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(14) > td:nth-child(3)',
steelUsed: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(15) > td:nth-child(3)',
aluminumUsed: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(16) > td:nth-child(3)',
aircraftDestroyedGround: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(21) > td:nth-child(3)',
soldiersKilledAir: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(22) > td:nth-child(3)',
####sDestroyedAir: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(23) > td:nth-child(3)',
shipsDestroyedAir: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(24) > td:nth-child(3)',
moneyDestroyedAir: '#rightcolumn > table:nth-child(11) > tbody > tr:nth-child(25) > td:nth-child(3)'
};
return {
infrastructureDestroyedValue: Number($(defenderPaths.infrastructureDestroyedValue).text().replace('$','').replaceAll(',','')),
moneyStolen: Number($(defenderPaths.moneyStolen).text().replace('$','').replaceAll(',','')),
soldiersKilled: Number($(defenderPaths.soldiersKilled).text().replaceAll(',','')),
####sDestroyed: Number($(defenderPaths.####sDestroyed).text().replaceAll(',','')),
aircraftDestroyed: Number($(defenderPaths.aircraftDestroyed).text().replaceAll(',','')),
shipsDestroyed: Number($(defenderPaths.shipsDestroyed).text().replaceAll(',','')),
missilesLaunched: Number($(defenderPaths.missilesLaunched).text().replaceAll(',','')),
nukesLaunched: Number($(defenderPaths.nukesLaunched).text().replaceAll(',','')),
munitionsUsed: Number($(defenderPaths.munitionsUsed).text().replaceAll(',','')),
gasolineUsed: Number($(defenderPaths.gasolineUsed).text().replaceAll(',','')),
steelUsed: Number($(defenderPaths.steelUsed).text().replaceAll(',','')),
aluminumUsed: Number($(defenderPaths.aluminumUsed).text().replaceAll(',','')),
aircraftDestroyedGround: Number($(defenderPaths.aircraftDestroyedGround).text().replaceAll(',','')),
soldiersKilledAir: Number($(defenderPaths.soldiersKilledAir).text().replaceAll(',','')),
####sDestroyedAir: Number($(defenderPaths.####sDestroyedAir).text().replaceAll(',','')),
shipsDestroyedAir: Number($(defenderPaths.shipsDestroyedAir).text().replaceAll(',','')),
moneyDestroyedAir: Number($(defenderPaths.moneyDestroyedAir).text().replace('$','').replaceAll(',',''))
};
}
function getMoney(thisNation, otherNation, resourceValues) {
var uraniumUsed = thisNation.nukesLaunched * 250;
return {
stolen: thisNation.moneyStolen - otherNation.moneyStolen,
lostInfra: -otherNation.infrastructureDestroyedValue,
lostSoldiers: -(otherNation.soldiersKilled + otherNation.soldiersKilledAir) * 1.25,
lost####s: -(otherNation.####sDestroyed + otherNation.####sDestroyedAir) * 60,
lostAircraft: -otherNation.aircraftDestroyed * 4000,
lostShips: -(otherNation.shipsDestroyed + otherNation.shipsDestroyedAir) * 50000,
missilesLaunched: -thisNation.missilesLaunched * 150000,
nukesLaunched: -thisNation.nukesLaunched * 1750000,
bombed: -otherNation.moneyDestroyedAir,
uraniumValue: -uraniumUsed * resourceValues.uranium,
gasolineValue: -thisNation.gasolineUsed * resourceValues.gasoline,
munitionsValue: -thisNation.munitionsUsed * resourceValues.munitions,
steelValue: -thisNation.steelUsed * resourceValues.steel,
aluminumValue: -thisNation.aluminumUsed * resourceValues.aluminum
};
}
function getNet(money) {
var net = 0;
for (const property in money) {
net += money[property];
}
return net;
}
function writeR###ltsToConsole(agressorMoney, agressorNet, defenderMoney, defenderNet, totalLoses, winnerNet) {
console.log('Agressor itemized loses: ' + JSON.stringify(agressorMoney, null, '\t'));
console.log('Agressor loses: $' + (-agressorNet).toLocaleString(undefined, {minimumFractionDigits:2}));
console.log('Defender itemized loses: ' + JSON.stringify(defenderMoney, null, '\t'));
console.log('Defender loses: $' + (-defenderNet).toLocaleString(undefined, {minimumFractionDigits:2}));
console.log('War total loses: $' + totalLoses.toLocaleString(undefined, {minimumFractionDigits:2}));
var winner = 'Defender';
if (agressorNet > defenderNet) {
winner = 'Agressor';
}
console.log(winner + ' wins by $' + winnerNet.toLocaleString(undefined, {minimumFractionDigits:2}));
}
function addR###ltsToPage($, agressorMoney, agressorNet, defenderMoney, defenderNet, totalLoses, winnerNet) {
let agressorColor = 'rgb(214, 39, 40)';
let defenderColor = 'rgb(31, 119, 180)';
let beforeDamageTablePath = '#rightcolumn > br:nth-child(9)';
let agressorNamePath = '#rightcolumn > table:nth-child(4) > tbody > tr > th > a:nth-child(1)';
let defenderNamePath = '#rightcolumn > table:nth-child(4) > tbody > tr > th > a:nth-child(2)';
let htmlTemplate = `<h2 class="center">Damage Value Inflicted</h2>
<table class="nationtable" style="width:100%">
<thead>
<tr>
<th colspan="2" width="50%">{{agressorName}}</th>
<th colspan="2">{{defenderName}}</th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="4" style="background: rgb(31, 119, 180); padding:0">
<div style="background: rgb(214, 39, 40); width: {{agressorRatio}}%; float: left">
<div style="text-align:right; padding-right: 10px">{{agressorRatio}}%</div>
</div>
<div style="width: {{defenderRatio}}%; float: left">
<div style="padding-left: 10px">{{defenderRatio}}%</div>
</div>
</td>
</tr>
<tr>
<th colspan="2">Statistic</th>
<th>{{agressorName}}<br><span class="txt-sm italic">Agressor</span></th>
<th>{{defenderName}}<br><span class="txt-sm italic">Defender</span></th>
</tr>
<tr>
<td colspan="2">Stolen/Lost:</td>
<td style="text-align:right">$ {{agressor-stolen}}</td>
<td style="text-align:right">$ {{defender-stolen}}</td>
</tr>
<tr>
<td colspan="2">Destroyed Infrastructure:</td>
<td style="text-align:right">$ {{defender-lostInfra}}</td>
<td style="text-align:right">$ {{agressor-lostInfra}}</td>
</tr>
<tr>
<td colspan="2">Killed soldiers:</td>
<td style="text-align:right">$ {{defender-lostSoldiers}}</td>
<td style="text-align:right">$ {{agressor-lostSoldiers}}</td>
</tr>
<tr>
<td colspan="2">Destroyed ####s:</td>
<td style="text-align:right">$ {{defender-lost####s}}</td>
<td style="text-align:right">$ {{agressor-lost####s}}</td>
</tr>
<tr>
<td colspan="2">Destroyed aircraft:</td>
<td style="text-align:right">$ {{defender-lostAircraft}}</td>
<td style="text-align:right">$ {{agressor-lostAircraft}}</td>
</tr>
<tr>
<td colspan="2">Destroyed ships:</td>
<td style="text-align:right">$ {{defender-lostShips}}</td>
<td style="text-align:right">$ {{agressor-lostShips}}</td>
</tr>
<tr>
<td colspan="2">Missiles received:</td>
<td style="text-align:right">$ {{defender-missilesLaunched}}</td>
<td style="text-align:right">$ {{agressor-missilesLaunched}}</td>
</tr>
<tr>
<td colspan="2">Nukes received:</td>
<td style="text-align:right">$ {{defender-nukesLaunched}}</td>
<td style="text-align:right">$ {{agressor-nukesLaunched}}</td>
</tr>
<tr>
<td colspan="2">Money bombed:</td>
<td style="text-align:right">$ {{agressor-bombed}}</td>
<td style="text-align:right">$ {{defender-bombed}}</td>
</tr>
<tr>
<td colspan="2">Opponent's uranium spent:</td>
<td style="text-align:right">$ {{defender-uraniumValue}}</td>
<td style="text-align:right">$ {{agressor-uraniumValue}}</td>
</tr>
<tr>
<td colspan="2">Opponent's gasoline used:</td>
<td style="text-align:right">$ {{defender-gasolineValue}}</td>
<td style="text-align:right">$ {{agressor-gasolineValue}}</td>
</tr>
<tr>
<td colspan="2">Opponent's munitions used:</td>
<td style="text-align:right">$ {{defender-munitionsValue}}</td>
<td style="text-align:right">$ {{agressor-munitionsValue}}</td>
</tr>
<tr>
<td colspan="2">Opponent's steel used:</td>
<td style="text-align:right">$ {{defender-steelValue}}</td>
<td style="text-align:right">$ {{agressor-steelValue}}</td>
</tr>
<tr>
<td colspan="2">Opponent's aluminum used:</td>
<td style="text-align:right">$ {{defender-aluminumValue}}</td>
<td style="text-align:right">$ {{agressor-aluminumValue}}</td>
</tr>
<tr>
<td colspan="2"><b>Total Value:</b></td>
<td style="text-align:right"><b>$ {{defender-net}}</b></td>
<td style="text-align:right"><b>$ {{agressor-net}}</b></td>
</tr>
</tbody>
</table>
<br>`;
var agressorRatio = Math.min(100, Math.max(0, Number.parseInt(100*(-defenderNet / totalLoses))));
var defenderRatio = 100 - agressorRatio;
var agressorName = $(agressorNamePath).text();
var defenderName = $(defenderNamePath).text();
var newHtml = htmlTemplate.replaceAll('{{agressorName}}',agressorName)
.replaceAll('{{defenderName}}',defenderName)
.replaceAll('{{agressorRatio}}',agressorRatio)
.replaceAll('{{defenderRatio}}',defenderRatio)
.replaceAll('{{agressor-net}}',(-agressorNet).toLocaleString(undefined, {minimumFractionDigits:2}))
.replaceAll('{{defender-net}}',(-defenderNet).toLocaleString(undefined, {minimumFractionDigits:2}))
.replaceAll('{{agressor-stolen}}', agressorMoney.stolen)
.replaceAll('{{defender-stolen}}', defenderMoney.stolen);
for (const property in agressorMoney) {
newHtml = newHtml.replaceAll('{{agressor-'+property+'}}', agressorMoney[property].replaceAll('-',''));
}
for (const property in defenderMoney) {
newHtml = newHtml.replaceAll('{{defender-'+property+'}}', defenderMoney[property].replaceAll('-',''));
}
$(beforeDamageTablePath).after(newHtml);
}