UJS WR Graph

Script will add function for recreating the WR graphs found in the Flash version, into the UJS version

目前为 2019-09-25 提交的版本。查看 最新版本

// ==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:&nbsp;<input class="ujs_wrInput" type="number" id="defendingArmies" value="10">
                    </div>
                    <div class="ujs_wrItem" id="ujs_wrKillRates">
                        Attacking Kill Rate:&nbsp;<input class="ujs_wrInput" type="number" id="attackKillRate" value="0.6"><br>
                        Defending Kill Rate:&nbsp;<input class="ujs_wrInput" type="number" id="defenseKillRate" value="0.7"><br>
                    </div>
                    <div class="ujs_wrItem" id="ujs_wrLuckSettings">
                        Luck Modifier:&nbsp;<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>
    `;
}

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址