Ikariam Automation

Attempts to automate all the routine tasks in ikariam, like transporting wine

Versión del día 10/04/2017. Echa un vistazo a la versión más reciente.

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         Ikariam Automation
// @namespace    Danielv123
// @version      1.1
// @description  Attempts to automate all the routine tasks in ikariam, like transporting wine
// @author       Danielv123
// @match        http*://*.ikariam.gameforge.com/*
// @grant        unsafeWindow
// ==/UserScript==

function main () {
    // Ikariam user tools
    // SEND CTs ---------------------------------------------------------
    // check if the CT option exists in message dialog
    // document.querySelector("option[value='77']").click();
    // Send the message
    // document.querySelector("#js_messageSubmitButton").click()
    // SEND RESOURCES ---------------------------------------------------
    window.sendAlot = function(townNumber, townFromNumber, resource, amount) {
        localStorage.resource = resource;
        localStorage.amount = amount;
        localStorage.destination = townNumber;
        localStorage.origin = townFromNumber;
        asdadas();
        //sendResources(townNumber, resource, window.asdadas);
    };
    window.asdadas = function(){
        if(localStorage.amount < 0) {
            transporterStatus = "Nothing to do, all resources sent";
        }
        if(document.querySelector("#js_GlobalMenu_freeTransporters").innerHTML < 2) {
            transporterStatus = "Waiting for free cargoships";
        }
        if(localStorage.paused == "true"){
            transporterStatus = "Script is paused";
        }
        if(localStorage.resource && localStorage.amount > 0) {
            //localStorage.amount -= 5000;
            sendResources(localStorage.destination, localStorage.origin, localStorage.resource);
        }
    };
    // send 5000 resources from one town to another
    window.sendResources = function(townNumber, fromTownNumber, resource, callback) {
        if(localStorage.paused == "true" /*|| Number(document.querySelector("#js_GlobalMenu_maxActionPoints").innerHTML) < 1*/ || document.querySelector("#js_GlobalMenu_freeTransporters").innerHTML < 2/* || document.querySelector("#js_CityPosition1PortCountdownText").innerHTML*/) {
            // if we have no action points OR the city is currently loading some ships, wait and do nothing.
            //setTimeout(function(){window.sendResources(townNumber,fromTownNumber,resource,callback);}, 10000);
            // NO, STOP IT, DON'T!
            // we already have a loop that keeps retrying. Relax.
        } else {
            // if sending to the same town, STOP IT. ITS NOT FUNNY.
            if(townNumber == fromTownNumber){
                throw "ERROR sending to same town? Not on my watch!";
            }
            // correct for the fact that the dock GUI does not show the currently selected town
            if(townNumber > fromTownNumber){
                townNumber--;
            }
            transporterStatus = "Going to town " + fromTownNumber + " to send resources";
            gotoTown(fromTownNumber, function(){
                if(Number(document.querySelector("#js_GlobalMenu_maxActionPoints").innerHTML) > 0){
                    // click dock on the left (gotta have dock there, no shipyardy stuff)
                    document.querySelector("#js_CityPosition1Link").click();
                    setTimeout(function(){
                        // get list if town sending targets from dock and click one
                        document.querySelectorAll(".cities.clearfix > li > a")[townNumber].click();
                        setTimeout(function(){
                            // either pick totalShips/actionPoints or 20, whatever is smaller.
                            let numberOfShips = Math.min(Math.floor(document.querySelector("#js_GlobalMenu_freeTransporters").innerHTML / Number(document.querySelector("#js_GlobalMenu_maxActionPoints").innerHTML)), 20);
                            if(document.querySelector("#js_GlobalMenu_freeTransporters").innerHTML >= numberOfShips){
                                // find the right resource selector slider and set it to 5k, then click the send button
                                let resourceID = "#textfield_" + resource;
                                // Set how much we send. Pick whatever is smaller of localStorage and what we can send right now.
                                document.querySelector(resourceID).value = Math.min(500*numberOfShips, localStorage.amount);
                                let sentAmount = Math.min(500*numberOfShips, localStorage.amount);
                                document.querySelector("#submit").click();
                                setTimeout(function(){
                                    // close window when stuff is sent
                                    transporterStatus = "Sent " + sentAmount + " " + resource;
                                    localStorage.amount -= sentAmount;
                                    if(callback && typeof callback == "function"){
                                        setTimeout(callback, 1000);
                                    }
                                    document.querySelector("div.close").click();
                                }, 2000);
                            } else {
                                transporterStatus = "Not enough ships";
                            }
                        },2000);
                    },2000);
                } else {
                    transporterStatus = "No action points left";
                }
            }); // end gototown callback
        }
    };
    window.gotoTown = function(townNumber, callback) {
        console.log("going to town " +townNumber);
        document.querySelector("#js_citySelectContainer > span").click();
        setTimeout(function(){
            try{
                document.querySelectorAll("#dropDown_js_citySelectContainer > div.bg > ul > li > a")[townNumber].click();
            } catch (e){}
            setTimeout(callback, 1000);
        },1000);
    };
    window.getTownResources = function(townNumber, callback) {
        var checkResources = function() {
            console.log(typeof callback);
            var resources = {};
            resources.wood = stringToNumber(document.querySelector("#resources_wood > span").innerHTML);
            resources.wine = stringToNumber(document.querySelector("#resources_wine > span").innerHTML);
            resources.marble = stringToNumber(document.querySelector("#resources_marble > span").innerHTML);
            resources.glass = stringToNumber(document.querySelector("#resources_glass > span").innerHTML);
            resources.sulfur = stringToNumber(document.querySelector("#resources_sulfur > span").innerHTML);
            callback(resources);
        };
        gotoTown(townNumber, checkResources);
    };
    window.stringToNumber = function(str) {
        return parseFloat(str.replace(',','').replace(' ',''));
    };
    setInterval(asdadas, 10000);
    // update userscript status box
    var transporterStatus;
    setInterval(function(){
        $("#transporterMaterial")[0].innerHTML = "Material: " + localStorage.resource;
        $("#transporterAmount")[0].innerHTML = "Amount: " + localStorage.amount;
        // transporterStatus is a global variable that is assigned throughout the functions to give an approximate as to what the script is doing
        $("#transporterStatus")[0].innerHTML = transporterStatus;
    },1000);
    // create form to send resources
    window.createForm = function (){
        let HTML = '<div><span>From: </span><select id="transporterSendFromTown">';
        let townList = document.querySelector("#dropDown_js_citySelectContainer > div.bg > ul").childNodes;
        for(let i = 0; i < townList.length; i++){
            HTML += '<option value="'+i+'">'+townList[i].childNodes[0].innerHTML+'</option>';
        }
        HTML += '</select></div>';
        HTML += '<div><span>Destination: </span><select id="transporterSendDestination">';
        for(let i = 0; i < townList.length; i++){
            HTML += '<option value="'+i+'">'+townList[i].childNodes[0].innerHTML+'</option>';
        }
        HTML += '</select></div>';
        HTML += '<div><span>Resource: </span><select id="transporterSendResource">';
        HTML += '<option value="wood">Wood</option>';
        HTML += '<option value="wine">Wine</option>';
        HTML += '<option value="marble">Marble</option>';
        HTML += '<option value="glass">Crystal</option>';
        HTML += '<option value="sulfur">Sulfur</option>';
        HTML += '</select></div>';
        HTML += '<div><span>Amount: </span><input id="transporterSendAmount" type="number"></div>';
        HTML += '<button onclick="sendResourcesFromForm();">Send resources</button>';
        return HTML;
    };
    window.sendResourcesDialog = function () {
        // use ikariams built in fancy dialog box for our dialog for extra fancyness
        ikariam.createPopup("ikaMationTransporterDialog","Mass transport resources",createForm(),"???","class");
    };
    window.sendResourcesFromForm = function () {
        let destination = document.querySelector("#transporterSendDestination").value;
        let fromTown = document.querySelector("#transporterSendFromTown").value;
        let resource = document.querySelector("#transporterSendResource").value;
        let amount = document.querySelector("#transporterSendAmount").value;
        sendAlot(destination, fromTown, resource, amount);
        document.querySelector("#ikaMationTransporterDialog").outerHTML = "";
    };
}
$('body').append("<div id='userscript' style='position:fixed;background-color:white;z-index:100000000;bottom:0px;right:0px;height:150px;width:200px;'></div>");
$("#userscript").append("<h2 style='font-size:20px;font-weight:bold;'>IkaMation</h2><button onclick='localStorage.paused = localStorage.paused == \"false\"'>Pause/resume script</button><p id='transporterMaterial'>Material: </p><p id='transporterAmount'>Amount:</p><p id='transporterStatus'></p>");

$("#userscript").append('<button onclick="sendResourcesDialog();">Mass send resources</button>');

var script = document.createElement('script');
script.appendChild(document.createTextNode('('+ main +')();'));
(document.body || document.head || document.documentElement).appendChild(script);
/*
let infoBox = document.createElement("div");
infoBox.appendChild(document.createTextNode("<div id='userscript' style='position:fixed;background-color:white;z-index:100000000;bottom:0px;right:0px;height:100px;width:200px;'></div>"));
(document.body|| document.documentElement).appendChild(infoBox);
*/