// ==UserScript== // @name Ikariam Automation // @namespace Danielv123 // @version 1.2.2 // @description Attempts to automate all the routine tasks in ikariam, like transporting wine // @author Danielv123 // @match *://*.ikariam.gameforge.com/* // @grant unsafeWindow // @downloadURL https://update.greasyfork.icu/scripts/28845/Ikariam%20Automation.user.js // @updateURL https://update.greasyfork.icu/scripts/28845/Ikariam%20Automation.meta.js // ==/UserScript== function main () { // Ikariam user tools // SEND CTs --------------------------------------------------------- // check if the CT option exists in message dialog // document.querySelector("option[value='77']").click(); // OR document.querySelector(".message_subject")[0].value = 77 // Send the message // document.querySelector("#js_messageSubmitButton").click() window.sendCulturalTreaty = function(callback, returnN) { callback = callback || function(x){}; // if 77 (send cultural treaty) is an option if(document.querySelector("option[value='77']")){ // Select cultural treaty document.querySelector(".message_subject")[0].value = 77; // click send button document.querySelector("#js_messageSubmitButton").click(); callback(true, returnN); } else { if(document.querySelector("#js_backlinkButton")){ document.querySelector("#js_backlinkButton").click(); } callback(false, returnN); } }; window.sendManyCulturalTreaties = function(numberOfTreaties){ // get array of all players in current high score screen let players = [].slice.call(document.querySelectorAll(".table01.highscore tbody tr"), 1); // let notPicked = true; let luckyPlayer = players[Math.floor(Math.random()*players.length)]; /*let i = 0; while(notPicked){ // players[i] }*/ // select message, send and then repeat if we got more stuff to send setTimeout(function(){ sendCulturalTreaty(function(status, returnN){ if(status){ returnN -= 1; } if(returnN > 0){ setTimeout(function(){ sendManyCulturalTreaties(returnN); }, 2000); } }, numberOfTreaties); },2000); }; // 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(Number(townNumber) > Number(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) or fixed now? if(document.querySelector("#position1").className.includes("port")){ document.querySelector("#js_CityPosition1Link").click(); } else if (document.querySelector("#position2").className.includes("port")){ document.querySelector("#js_CityPosition2Link").click(); } else { transporterStatus = "No dock, what do you think you are doing???"; } 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 = '
From:
'; HTML += '
Destination:
'; HTML += '
Resource:
'; HTML += '
Amount:
'; HTML += ''; 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("
"); $("#userscript").append("

IkaMation

Material:

Amount:

"); $("#userscript").append(''); 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("
")); (document.body|| document.documentElement).appendChild(infoBox); */