// ==UserScript== // @name UJS WR Graph // @namespace http://tampermonkey.net/ // @version 1.0.1 // @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=* // @downloadURL none // ==/UserScript== var hasInitiatedGraphUI = false; var captureChanceGraph; var armiesKilledGraph; function checkValidInput() { var defendingArmies = Number(document.getElementById("defendingArmies").value); var luckModifier = Number(document.getElementById("luckModifier").value) / 100.0; var attackKillRate = Number(document.getElementById("attackKillRate").value) / 100.0; var defenseKillRate = Number(document.getElementById("defenseKillRate").value) / 100.0; if (defendingArmies < 0 || luckModifier < 0 || luckModifier > 1 || attackKillRate <= 0 || attackKillRate > 1 || defenseKillRate <= 0 || defenseKillRate > 1) { return false; } else { return true; } } function doCalculate() { if (!hasInitiatedGraphUI) { hasInitiatedGraphUI = true; initiateGraphUI(); } if (checkValidInput()) { makeGraph(); } else { alert("UJS WR GRAPH -- ENTER CORRECT INPUT!"); } } function getButton() { return ''; } function initiateButtonUI() { var wrButton = document.createElement("div"); wrButton.innerHTML = getButton(); var navBox = document.getElementsByClassName("navbar-nav")[0]; navBox.prepend(wrButton); var el = document.getElementById("ujs_WRAnalyzeAttackBtn"); if (el.addEventListener) { el.addEventListener("click", doCalculate, false); } else if (el.attachEvent) { el.attachEvent('onclick', doCalculate); } } function initiateGraphUI() { 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 el = document.getElementById("ujs_wrCalculateBtn"); if (el.addEventListener) { el.addEventListener("click", doCalculate, false); } else if (el.attachEvent) { el.attachEvent('onclick', doCalculate); } window.onkeypress = function(event) { if (event.keyCode == 13) { doCalculate(); } }; } (function() { 'use strict'; console.log("Running UJS Graph Script by JustinR17"); initiateButtonUI(); document.addEventListener("mousewheel", function(event){ if(document.activeElement.type === "number"){ document.activeElement.blur(); } }); })(); 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 xyDataValues = getCaptureChanceData(); var xDataValues = getXDataValues(xyDataValues); var captureChance = document.getElementById('ujs_CaptureChanceGraph'); if (captureChanceGraph) { captureChanceGraph.destroy(); } 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'); if (armiesKilledGraph) { armiesKilledGraph.destroy(); } 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 round(value, decimals) { return Number(Math.round(value +'e'+ decimals) +'e-'+ decimals).toFixed(decimals); } function getCaptureChanceData() { var data = []; var defendingArmies = Number(document.getElementById("defendingArmies").value); var attackKillRate = Number(document.getElementById("attackKillRate").value) / 100.0; var expectedKillsFromDefense = Math.round(defendingArmies / attackKillRate); var luckModifier = Number(document.getElementById("luckModifier").value) / 100.0; var pivot = Math.round(expectedKillsFromDefense + expectedKillsFromDefense * (1 - attackKillRate) * 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; } percentCapture = round(percentCapture, 2); 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) / 100.0; var defenseKillRate = Number(document.getElementById("defenseKillRate").value) / 100.0; 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; } armiesKilled = round(armiesKilled, 2); var temp = {x: i, y: armiesKilled}; data.push(temp); } return data; } function getDefenderArmiesKilledData() { var data = []; var attackKillRate = Number(document.getElementById("attackKillRate").value) / 100.0; 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; } defenderArmiesKilled = round(defenderArmiesKilled, 2); var temp = {x: i, y: defenderArmiesKilled}; data.push(temp); } return data; } function getAnalyzeWindow() { return `