// ==UserScript==
// @name UJS WR Graph
// @namespace http://tampermonkey.net/
// @version 0.9.0
// @description Script will add function for recreating the WR graphs found in the Flash version, into the UJS version
// @author JustinR17
// @match https://www.warzone.com/MultiPlayer?GameID=*
// ==/UserScript==
function doCalculate() {
makeGraph();
}
function getButton() {
return '<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#ujs_WRAnalyzeAttackDialog" id="ujs_WRAnalyzeAttackBtn">WR Analyze Attack</button>';
}
function initiateUI() {
var wrButton = document.createElement("div");
wrButton.innerHTML = getButton();
var navBox = document.getElementsByClassName("navbar-nav")[0];
navBox.prepend(wrButton);
var wrAnalyzeWindow = document.createElement("div");
var mainWindow = document.getElementById("ujs_Live");
mainWindow.appendChild(wrAnalyzeWindow);
wrAnalyzeWindow.outerHTML = getAnalyzeWindow();
wrAnalyzeWindow.style.margin = "2%";
wrAnalyzeWindow.style.display = "none";
var items = document.querySelectorAll(".ujs_wrItem");
for (var i = 0; i < items.length; i++) {
items[i].style.color = "white";
}
var el1 = document.getElementById("ujs_WRAnalyzeAttackBtn");
if (el1.addEventListener) {
el1.addEventListener("click", doCalculate, false);
} else if (el1.attachEvent) {
el1.attachEvent('onclick', doCalculate);
}
var el2 = document.getElementById("ujs_wrCalculateBtn");
if (el2.addEventListener) {
el2.addEventListener("click", doCalculate, false);
} else if (el2.attachEvent) {
el2.attachEvent('onclick', doCalculate);
}
window.onkeypress = function(event) {
if (event.keyCode == 13) {
doCalculate();
}
}
}
(function() {
'use strict';
console.log("Running UJS Graph Script by JustinR17");
setTimeout(initiateUI, 2000);
})();
function getXDataValues(xyDataValues) {
var values = [];
for (var i = 0; i < xyDataValues.length; i++) {
values.push(xyDataValues[i].x);
}
return values;
}
function getYDataValues(xyDataValues) {
var values = [];
for (var i = 0; i < xyDataValues.length; i++) {
values.push(xyDataValues[i].y);
}
return values;
}
function makeGraph() {
var captureChance = document.getElementById('ujs_CaptureChanceGraph');
var xyDataValues = getCaptureChanceData();
var xDataValues = getXDataValues(xyDataValues);
var captureChanceGraph = new Chart(captureChance, {
type: 'line',
data: {
labels: xDataValues,
datasets: [
{
data: xyDataValues,
label: "Capture Chance",
borderColor: "#3e95cd"
}
]
},
xAxisId: "Number of Attacking Armies",
yAxisId: "Percent chance of taking",
options: {
legend: false,
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
min: 0,
max: 100
},
scaleLabel: {
display: true,
labelString: "Percent Chance of Taking"
}
}],
xAxes: [{
scaleLabel: {
display: true,
labelString: "Number of Attacking Armies"
}
}]
}
}
});
var xyOffenseDataValues = getAttackerArmiesKilledData();
var xyDefenseDataValues = getDefenderArmiesKilledData();
var xArmiesDataValues = getXDataValues(xyDefenseDataValues);
var armiesKilled = document.getElementById('ujs_ArmiesKilledGraph');
var armiesKilledGraph = new Chart(armiesKilled, {
type: 'line',
data: {
labels: xArmiesDataValues,
datasets: [
{
data: xyOffenseDataValues,
label: "Attackers Lost",
borderColor: "#3e95cd"
},{
data: xyDefenseDataValues,
label: "Defenders Lost",
borderColor: "#8e5ea2"
}
]
},
xAxisId: "Number of Attacking Armies",
yAxisId: "Armies Lost",
showLine: true,
options: {
scales: {
yAxes: [{
ticks: {
beginAtZero: true,
min: 0,
max: Number(document.getElementById("defendingArmies").value)
},
scaleLabel: {
display: true,
labelString: "Armies Lost"
}
}],
xAxes: [{
scaleLabel: {
display: true,
labelString: "Number of Attacking Armies"
}
}]
}
}
});
}
function getCaptureChanceData() {
var data = [];
var defendingArmies = Number(document.getElementById("defendingArmies").value);
var expectedKillsFromDefense = Math.round(defendingArmies / 0.6);
var luckModifier = Number(document.getElementById("luckModifier").value);
var attackKillRate = Number(document.getElementById("attackKillRate").value);
var pivot = Math.round(expectedKillsFromDefense * luckModifier + expectedKillsFromDefense * (1.00 - luckModifier));
for (var i = pivot - 3; i < pivot + 3; i++) {
var expectedKills = i * attackKillRate;
var actualKills = Math.round(i * (1-attackKillRate)) * luckModifier + expectedKills * (1.00 - luckModifier);
var percentCapture;
if (actualKills - defendingArmies < -1) {
percentCapture = 0.0;
} else if (actualKills > defendingArmies || actualKills == defendingArmies) {
percentCapture = 100.0;
} else {
percentCapture = (actualKills % 1.0) * 100.0;
}
var temp = {x: i, y: percentCapture};
data.push(temp);
}
return data;
}
function getMaxTurns(defenders, attackKillRate) {
var maxTurns = defenders / attackKillRate + 5;
return maxTurns;
}
function getAttackerArmiesKilledData() {
var data = [];
var attackKillRate = Number(document.getElementById("attackKillRate").value);
var defenseKillRate = Number(document.getElementById("defenseKillRate").value);
var defenders = Number(document.getElementById("defendingArmies").value);
var maxTurns = getMaxTurns(defenders, attackKillRate);
var maxAttackersKilled = defenders * defenseKillRate;
for (var i = 0; i < maxTurns; i++) {
var armiesKilled = maxAttackersKilled;
if (i < maxAttackersKilled) {
armiesKilled = i;
}
var temp = {x: i, y: armiesKilled};
data.push(temp);
}
return data;
}
function getDefenderArmiesKilledData() {
var data = [];
var attackKillRate = Number(document.getElementById("attackKillRate").value);
var defenseKillRate = Number(document.getElementById("defenseKillRate").value);
var defenders = Number(document.getElementById("defendingArmies").value);
var maxTurns = getMaxTurns(defenders, attackKillRate);
for (var i = 0; i < maxTurns; i++) {
var defenderArmiesKilled = i * attackKillRate;
if (defenderArmiesKilled > defenders) {
defenderArmiesKilled = defenders;
}
var temp = {x: i, y: defenderArmiesKilled};
data.push(temp);
}
return data;
}
function getAnalyzeWindow() {
return `
<div class="modal fade" id="ujs_WRAnalyzeAttackDialog">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content ujs_wrItem" id="ujs_WRAnalyzeAttackDialog">
<div class="modal-header modal-title ujs_wrItem" id="ujs_wrAnalyzeTitle">
WR Analyze Attack by JustinR17
</div>
<div class="modal-body ujs_wrItem" id="ujs_wrSettingsPanel">
<div class="ujs_wrItem" id="ujs_wrDefendingArmies">
Defending Armies: <input class="ujs_wrInput" type="number" id="defendingArmies" value="10">
</div>
<div class="ujs_wrItem" id="ujs_wrKillRates">
Attacking Kill Rate: <input class="ujs_wrInput" type="number" id="attackKillRate" value="0.6"><br>
Defending Kill Rate: <input class="ujs_wrInput" type="number" id="defenseKillRate" value="0.7"><br>
</div>
<div class="ujs_wrItem" id="ujs_wrLuckSettings">
Luck Modifier: <input class="ujs_wrInput" type="number" id="luckModifier" value="0.16"><br><br>
</div>
<div class="ujs_wrItem" id="ujs_wrGraphContainer">
<div class="ujs_wrItem" id="ujs_wrCaptureChanceContainer"
style="left: 10px; bottom: 10px; transform-origin: 247px -105px; background-color: white;">
<br><h4 style="text-align:center; color: black">Percent Capture Graphs</h4><br>
<canvas class="ujs_wrItem" id="ujs_CaptureChanceGraph" width="600" height="300"></canvas>
</div>
<div class="ujs_wrItem" id="ujs_wrArmiesKilledContainer"
style="left: 10px; bottom: 10px; transform-origin: 247px -105px; background-color: white;">
<br><h4 style="text-align:center; color: black">Armies Lost Graph</h4><br>
<canvas class="ujs_wrItem" id="ujs_ArmiesKilledGraph" width="600" height="300"></canvas>
</div>
</div>
<div class="ujs_wrItem" id="ujs_wrCalculate">
<button class="ujs_wrItem btn btn-primary" id="ujs_wrCalculateBtn">Recalculate</button>
</div>
</div>
<div class="modal-footer">
<button class="ujs_wrItem btn btn-primary close" data-dismiss="modal" id="ujs_wrCloseButton" style="background-color: blue">Close</button>
</div>
</div>
</div>
</div>
`;
}