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