Ikariam Automation

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

As of 2017-04-10. See the latest version.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==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);
*/