// ==UserScript== // @name Backtime times in inc screen // @version 0.5.2 // @description New table column with backtimes if the attacks are labelled correctly (lcav, hcav, noble etc.) // @author FunnyPocketBook // @match https://*/game.php?village=*&screen=overview_villages&mode=incomings* // @grant none // ==/UserScript== var table = document.querySelector("#incomings_table > tbody > tr:nth-child(1)"); var newBacktime = document.createElement("th"); // Table head for Backtime newBacktime.setAttribute("style", "width:100px"); newBacktime.innerHTML = "Backtime"; table.appendChild(newBacktime); var domain = document.domain; var unitSpeed; var worldSpeed; var speed; // Get world and unit speed $(document).ready(function() { $.ajax({ type: "GET", url: "https://" + domain + "/interface.php?func=get_config", dataType: "xml", success: function(xml) { unitSpeed = parseFloat(xml.querySelector("config > unit_speed").innerHTML); worldSpeed = parseFloat(xml.querySelector("config > speed").innerHTML); speed = unitSpeed * worldSpeed; // Set factor of unit speed backtimeCreate(); } }); }); // Creates elements to put in the backtime times function backtimeCreate() { "use strict"; var tableLength = document.querySelector("#incomings_table > tbody").rows.length; // Make the bottom bar longer to make it look prettier if (document.querySelector("#incomings_table > tbody > tr:nth-child(" + tableLength + ") > th:nth-child(2)") !== null) { var bottomTh = document.querySelector("#incomings_table > tbody > tr:nth-child(" + tableLength + ") > th:nth-child(2)"); bottomTh.setAttribute("colspan", "7"); } else if (document.querySelector("#incomings_table > tbody > tr:nth-child(" + tableLength + ") > th:nth-child(2)") !== null) { var bottomTh1 = document.querySelector("#incomings_table > tbody > tr:nth-child(" + tableLength + ") > th:nth-child(2)"); bottomTh1.setAttribute("colspan", "7"); } // For every command, do for (var i = 2; i < tableLength; i++) { // Get attack names, remove any spaces and line breaks, make them lower case var attackName = document.querySelector("#incomings_table > tbody > tr:nth-child(" + i + ") > td:nth-child(1) > span > span > a:nth-child(1) > span.quickedit-label").innerHTML.replace(/(\r\n|\n|\r)/gm, "").replace(/ /g, "").toLowerCase(); // Get coordinates of origin and destination village var destination = document.querySelector("#incomings_table > tbody > tr:nth-child(" + i + ") > td:nth-child(2) > a").innerHTML.slice(-12).substr(0, 7); var origin = document.querySelector("#incomings_table > tbody > tr:nth-child(" + i + ") > td:nth-child(3) > a").innerHTML.slice(-12).substr(0, 7); // Get x and y of destination and origin var x1 = destination.substr(0, 3); var y1 = destination.slice(-3); var x2 = origin.substr(0, 3); var y2 = origin.slice(-3); // Calculate the exact distance between both villages var x = Math.abs(x1 - x2); var y = Math.abs(y1 - y2); x = x * x; y = y * y; var distance = Math.sqrt(x + y); var unitSpeedDefault; // Set the slowest unit speed based on the label of the attack if (attackName.includes("axe") || attackName.includes("spear") || attackName.includes("archer")) { unitSpeedDefault = 18; } else if (attackName.includes("sword")) { unitSpeedDefault = 22; } else if (attackName.includes("spy")) { unitSpeedDefault = 9; } else if (attackName.includes("lcav") || attackName.includes("marcher")) { unitSpeedDefault = 10; } else if (attackName.includes("hcav")) { unitSpeedDefault = 11; } else if (attackName.includes("ram") || attackName.includes("cat")) { unitSpeedDefault = 30; } else if (attackName.includes("noble")) { unitSpeedDefault = 35; } var unitSpeedReal = unitSpeedDefault / speed; // Minutes per field var time = unitSpeedReal * distance; // Duration of the attack in minutes time = convertToTime(time); // Convert the minutes to a string in the format HH:MM:SS // Get the arrival time var incTime = document.querySelector("#incomings_table > tbody > tr:nth-child(" + i + ") > td:nth-child(6)").innerText; var subIncTime = incTime.slice(-12); subIncTime = subIncTime.substring(0, 8); var backtime = calculate(subIncTime, time); // Calculate the time when the troops of the attacker are back at his village // Create td to put in the backtime time var backtimeTd = document.createElement("td"); backtimeTd.setAttribute("id", "backtimeTd" + i); backtimeTd.innerHTML = backtime; var tr = document.querySelector("#incomings_table > tbody > tr:nth-child(" + i + ")"); tr.appendChild(backtimeTd); if (attackName !== "axe" && attackName !== "spear" && attackName !== "archer" && attackName !== "sword" && attackName !== "spy" && attackName !== "lcav" && attackName !== "marcher" && attackName !== "hcav" && attackName !== "ram" && attackName !== "cat" && attackName !== "noble") { document.getElementById("backtimeTd" + i).innerHTML = "Please label the incoming attack correctly"; } } } // Convert minutes to HH:MM:SS function convertToTime(duration) { "use strict"; var seconds = (duration - parseInt(duration)) * 60; seconds = Math.round(seconds); duration = parseInt(duration); var minutes = duration % 60; duration = duration - minutes; var hours = duration / 60; hours = ("0" + hours).slice(-2); minutes = ("0" + minutes).slice(-2); seconds = ("0" + seconds).slice(-2); return hours + ":" + minutes + ":" + seconds; } // Add two times function calculate(time1, time2) { "use strict"; var time1Split = time1.split(":"); var time2Split = time2.split(":"); var s1 = parseInt(time1Split[2]); var m1 = parseInt(time1Split[1]); var h1 = parseInt(time1Split[0]); var s2 = parseInt(time2Split[2]); var m2 = parseInt(time2Split[1]); var h2 = parseInt(time2Split[0]); var s = s1 + s2; var m = m1 + m2; var h = h1 + h2; if (s >= 60) { s = s - 60; m = m + 1; } if (m >= 60) { m = m - 60; h = h + 1; } var days = 0; while (h >= 24) { h = h - 24; days++; } var hr = h; var min = m; var sec = s; var day; if (days === 0) { day = "same day as arrival at "; } else if (days === 1) { day = "one day after arrival at "; } else { day = days + " days after arrival at "; } hr = ("0" + hr).slice(-2); min = ("0" + min).slice(-2); sec = ("0" + sec).slice(-2); return day + hr + ":" + min + ":" + sec; }