Randomized Bonus

Create randomized bonus games on Warlight.

Você precisará instalar uma extensão como Tampermonkey, Greasemonkey ou Violentmonkey para instalar este script.

You will need to install an extension such as Tampermonkey to install this script.

Você precisará instalar uma extensão como Tampermonkey ou Violentmonkey para instalar este script.

Você precisará instalar uma extensão como Tampermonkey ou Userscripts para instalar este script.

Você precisará instalar uma extensão como o Tampermonkey para instalar este script.

Você precisará instalar um gerenciador de scripts de usuário para instalar este script.

(Eu já tenho um gerenciador de scripts de usuário, me deixe instalá-lo!)

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar uma extensão como o Stylus para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

Você precisará instalar um gerenciador de estilos de usuário para instalar este estilo.

(Eu já possuo um gerenciador de estilos de usuário, me deixar fazer a instalação!)

// ==UserScript==
// @name         Randomized Bonus
// @namespace    Deadman_RB
// @version      1.02
// @description  Create randomized bonus games on Warlight.
// @author       Deadman
// @match        https://www.warlight.net/Profile?p=*
// @grant        GM_xmlhttpRequest
// ==/UserScript==

// Compute Player Ids
var idRegex = /p=(\d+)/;
var yourProfileLink = document.evaluate('/html/body/div[1]/span/div/a[2]',
    document, null, XPathResult.ANY_TYPE, null).iterateNext();
var yourId = yourProfileLink.href.match(idRegex)[1];
var opponentId = document.URL.match(idRegex)[1];
if (yourId == opponentId) {
    opponentId = "OpenSeat";
}

// Add text box and button
var levelElement = document.evaluate(
    '//*[@id="MainSiteContent"]/table/tbody/tr[2]/td[2]/table/tbody/tr/td/big',
    document, null, XPathResult.ANY_TYPE, null).iterateNext();
addRandomizedButton(levelElement);

function getSampleGameId() {
    /// <summary>
    /// Gets the sample game Id and checks if it is a number.
    /// </summary>
    /// <returns type="number">Game Id.</returns>
    var gameIdElement = document.getElementById("gameId");
    if (gameIdElement !== undefined) {
        return parseInt(gameIdElement.value, 10);
    }
}

function extractGameSettings() {
    /// <summary>
    /// Extract game settings from the sample game using GameFeed API.
    /// </summary>

    var sampleGameId = getSampleGameId();
    if (isNaN(sampleGameId)) {
        alert("Invalid GameId");
    } else {
        doAsyncRequest("POST",
            'https://www.warlight.net/API/GameFeed?GameID=' +
            sampleGameId.toString() + '&GetHistory=true', {},
            "GameFeed");
    }
}

function setupRandomizedGame(response) {
    /// <summary>
    /// From the GameFeed API response, randomize bonuses and create a game 
    /// using the template.
    /// </summary>
    /// <param name="response" type="string">
    /// The GameFeed API response for the provided sample game.
    /// </param>

    var obj = JSON.parse(response);
    if (obj != undefined) {
        var templateId = obj.templateID;
        var bonuses = [];
        for (var i = 0; i < obj.map.bonuses.length; i++) {
            var bonusObj = obj.map.bonuses[i];
            if (bonusObj.value != 0) {
                var bonus = [];
                var originalBonusValue = parseInt(bonusObj.value, 10);

                // set the bonus value to (original-1, original+1)
                bonus.push(bonusObj.name);
                bonus.push(originalBonusValue - 1);
                bonus.push(originalBonusValue + 1);
                bonuses.push(bonus);
            }
        }
    }
    createGame(templateId, bonuses);
}

function addRandomizedButton(levelElement) {
    /// <summary>
    /// Add a text box(for sample game Id) and a button to create randomized 
    /// game.
    /// </summary>
    /// <param name="levelElement" type="Element">
    /// The parent element if text box and button.
    /// </param>

    var br = document.createElement('br');
    var gameId = document.createElement("input");
    gameId.setAttribute("id", "gameId");
    gameId.setAttribute("type", "text");
    var createButton = document.createElement("input");
    createButton.setAttribute("type", "button");
    createButton.setAttribute("value", "Create Randomized game");
    createButton.onclick = function () {
        var oldValue = createButton.value;
        createButton.setAttribute('disabled', true);
        createButton.value = '...processing...';

        setTimeout(function(){
            createButton.value = oldValue;
            createButton.removeAttribute('disabled');
        }, 1000);
        extractGameSettings();
    };

    // used to store response from GameFeed API
    var hiddenResponse = document.createElement("input");
    hiddenResponse.setAttribute("type", "hidden");
    hiddenResponse.setAttribute("id", "WLresponse");
    hiddenResponse.onchange = function (value) {
        setupRandomizedGame(hiddenResponse.value);
    };
    levelElement.appendChild(br);
    levelElement.appendChild(gameId);
    levelElement.appendChild(createButton);
    levelElement.appendChild(hiddenResponse);
}

function createGame(templateId, bonuses) {
    /// <summary>
    /// Create a game on Warlight between the two players on given settings.
    /// </summary>
    /// <param name="templateId" type="number">
    /// The game template Id.
    /// </param>
    /// <param name="bonuses" type="array">
    /// All bonuses on the map and the range of values they can take.
    /// </param>

    var template = templateId;
    var postDataObject = {
        "gameName": "Randomized bonuses game",
        "personalMessage": "Check bonuses carefully as they may have been altered",
        "templateID": template,
        "players": [{
            "token": yourId,
            "team": "None"
        }, {
            "token": opponentId,
            "team": "None"
        }],
        "overriddenBonuses": []
    };
    if (bonuses !== null) {
        for (var i = 0; i < bonuses.length; i++) {
            var bonusName = bonuses[i][0];
            var min = bonuses[i][1];
            var max = bonuses[i][2];
            postDataObject.overriddenBonuses.push({
                "bonusName": bonusName,
                value: getRandomInt(min, max) // Randomize the bonus
            });
        }
    }
    var response = doAsyncRequest("POST",
        'https://www.warlight.net/API/CreateGame', JSON.stringify(
            postDataObject), "CreateGame");
}

function getRandomInt(min, max) {
    /// <summary>
    /// Pick a random number in the interval (min, max)
    /// </summary>
    /// <param name="min" type="number">
    /// lower bound of number
    /// </param>
    /// <param name="max" type="number">
    /// upper bound of number
    /// </param>
    /// <returns type="number">
    /// Random number in the interval
    /// </returns>

    return Math.floor(Math.random() * (max - min + 1)) + min;
}

function doAsyncRequest(method, url, data, api) {
    /// <summary>
    /// Perform an asynchronous request to create a game on Warlight.
    /// </summary>
    /// <param name="method" type="string">
    /// GET/POST
    /// </param>
    /// <param name="url" type="string">
    /// The request url.
    /// </param>
    /// <param name="data" type="dictionary">
    /// Request parameters
    /// </param>
    /// <param name="api" type="string">
    /// Warlight api type
    /// </param>
    GM_xmlhttpRequest({
        method: method,
        url: url,
        data: data,
        onreadystatechange: function (response) {
            if (response.readyState != 4) return;
            if (api === "GameFeed") {
                var hiddenResponse = document.getElementById(
                    "WLresponse");
                hiddenResponse.value = response.responseText;
                hiddenResponse.onchange();
            } else if (api === "CreateGame") {
                var obj = JSON.parse(response.responseText);
                if (obj.gameID !== undefined) {
                    window.open(
                        "https://www.warlight.net/MultiPlayer?GameID=" +
                        obj.gameID, '_parent ');
                } else if (obj.error !== undefined) {f
                    alert("Cannot create game. Warlight says: " +
                        obj.error);
                }
            }
        }
    });
}