Académique Documents
Professionnel Documents
Culture Documents
/*****************
* * * Settings * * * *
******************/
var LOG_LEVEL = 1; // 0 - quiet, 1 - nearly quite, 2 - verbose, 3 - detailed
var iCheckEvery = 10000; // How often do we check for tasks to trigger in
miliseconds.
// Low value = high accuracy in triggering tasks. To
make your browser
// unresponsive, set this to some
ridiculously small number. Default is 10000
var sLang = ""; // Set this to override the automatic language detection.
Available translations: see below.
var iPreloadTime = 20; // How many seconds ahead is the code for building and
upgrading prefetched.
// If the code is not available by the time the
construction should start, the
// construction will be cancelled. This value
must be greater than iCheckEvery
// in seconds (i.e. iCheckEvery/1000). Default
is 20.
var bDisplayVillageNames = true; //Display village names instead of numbers. May
hit the performance.
/**********************
**** End of Settings ****
***********************/
var sCurrentVersion = "1.1.8"; //Version number with which we need to run the
update fu
var bUseServerTime = getOption("USE_SERVER_TIME", false, "boolean");
//IMPORTANT!!! If true, you must be using 24-hour format on your server, otherwise
there WILL be errors.
// Your local computer time MUST still be
correct (both time and date!).
var bLocked = false; // for locking the TTQ_TASKS cookie
var bLockedCode = false; // for locking the TTQ_CODE_0 and TTQ_CODE_0 cookies
var bLockedHistory = false;
var oIntervalReference = null;
var iSessionRefreshRate = 60; //Amount of minutes after which the session is
refreshed by reloading the dorf1 page in the background. If set to 0, refreshing
is disabled. Default: 60
var iMaxPlaceNamesCookieLength = 15; //maximum number of names stored in the
cookie before it is cleared
var iMyRace = getOption("RACE", 0, "integer"); // 0- Romans, 1- Teutons, 2-
Gauls. Set via dialogue.
var iHistoryLength = getOption("HISTORY_LENGTH", 7, "integer");
var aLangBuildings = []; //multilang support
var aLangTasks = []; //multilang support
var aLangStrings = []; //multilang support
var aLangTroops = [];
// Images
var sCloseBtn =
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAIAAAAmdTLBAAAABmJLR0QA/wD
/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1gYKECMhBqiEGQAAADJ0RVh0Q29tbWVud
ABFcnN0ZWxsdCB2b24gRmxvcmlhbiBTY2hyZWllciBtaXQgVGhlIEdJTVCOHcWrAAADLUlEQVR42pWUPYh
dRRiG32/OuTdZXTcas0n2ZiVVYBttLFLFQuNPZTQgiIIphGBAtNTC0lZBRRQVEYWoBAyk8ActRFCRLa3Sp
NH9icm699695+6Z+X5ei7Obtc1UH+/MM+/M9w4jJD0wnNi9czVuZ3iwSlKbQ5ohP3rzn+FGTBvmlqbUgpR
gBQDdAbC0AOAepbV2ezI3v/Txd+nuQ0Jy4+3XqsMDqeqYjHxryJJRCiPgRneAMKU7rbBktlNrtoaj0Wrvr
pMXlxMAH29Kf5/0+6hqqXtS16h7SImpkqqSVCHVkipIQqq6NanuTdZXDs7VNQA2WzEZS12znTJvM2eWQi1
UpSnDqQUgtcCVpnRHSqmqACQA1BKToY83oxnPPvz0/BvvR9OwaaKZeDOO8TC2NmP077FPfjzw/CvM23STl
KTu3eKV04bbE+a8/8FTAI6+dTG00Aq00DK1LF78HcDs6bNwAwPcSaHjc5TCXKh6/fVz3cTggytwQzjc7vt
6uRP/OrOEcGEAAXKHB8DcRm5pCvf1V5/pxGOf/kT64pd/7MBPnoArXEEXUrDLRztFyVCFOSMoXH35TMcsf
vFrV6ycXUqJIiFwoUmYROz6mzK30LJ7Nwq5+tITt57a6rP3S6IIk0TqeBrC9/oXVhjOcGGIAAmDD7+/xQ+
++jMl7PmHwlXC9vrHkqkFYWSQXHjvSkeun3+oK458tizdFjAJEytpz98KNdMK3Ri+8M43O/CFRwBef/EkA
Llj7sila4IQBlzFC013+bLjT9WFdy938NqFx0CCBHjj3AOdePjyqoSmDv7f+Qtzy9JS8/SXbwGsnT8NN3b
5hzP8xnMnALQ/fI5wmkELzQAIyWun5qsD98jMbNq3X6oaAjAEAYRQJYpYFi+wgtKyFMtlPPWrW3zqatQAV
Eu020kqiZCqliQIh6CLOoXCi1iBFahRzdTVQh0A6pujaA4OuHkDyqqfUdWAgCFCYQi9gsNVwukqZjQ35Ug
hC8cByDSTG3///MKjo7WVfq+mSEhCRJVEAKFXdAlPDPdAeMUozjh6/PFLv/UPDYRkVuzr3dbfh5sjv3Omm
unjP4EhhHJu9NM9AAAAAElFTkSuQmCC";
var sDeleteBtn =
"data:image/gif;base64,R0lGODlhDAAMANU2AN4ZCtAgFNAgHdsgA9waCs4cDMwkHPNfHcspJ9oYCso
YDc8pINAYCvg0AORNOeFFPtA7O+c+QNRTU8BMSb4gHN5lTNooGsc1N+g+PuEkJOhOKLlVWOwxD9MlGtUiF
MwjFcI7LtcfDPY9ANs5L+JMSOxhJLRDO+YfDdYEAPdvHORZRMkZC9EcDcwXE8ssLtonG9gbG+M8EOEZGdk
ZDNwVCb0pKwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAADYALAAAAAAMAAwAQAZJQNNgY
isajzZVDHRMBJC2TEvxOY40HNfRsEJGYBKS51gS1aA2gCXVQEApDONDBikuCmgMioV2vC5FMx1GFQchG0g
0BDYnAmhFQQA7";
//Styles
var cssStyle = "";
cssStyle += "#ttq_tasklist, #ttq_history {position:absolute; background-
color:#90DD43; border:1px solid #000000; color:#000000; padding:5px 10px; z-
index:100; -moz-border-radius:5px;}";
cssStyle += "#ttq_history {background-color:#D4D4EC}";
cssStyle += ".ttq_history_row {padding:1px 5px;}";
cssStyle += ".ttq_village_name {font-weight:bold;}";
cssStyle += ".ttq_draghandle {font-size: 120%; font-weight:bold;}";
cssStyle += ".ttq_time_village_wrapper {font-style:italic; font-size:80%;
display:block;}";
cssStyle += ".ttq_close_btn {float:right; padding:2px 4px; color:white; margin:-
5px -15px 0 0;}";
cssStyle += "#timerForm {padding:10px 20px; }";
cssStyle += "#timerform_wrapper {position:absolute; max-width:900px !important;
margin:0; background-color:#FBEC87; color:black; border:1px #000000 solid; z-
index:100; -moz-border-radius:5px;}";
cssStyle += "#timerform_wrapper p {}";
cssStyle += "#ttq_message {position:absolute; z-index:100; border:1px solid black;
padding:10px 20px; color:black; width:335px}";
cssStyle += ".handle {cursor: move;}";
cssStyle += "a.ttq_sortlink, a#ttq_flush_history {color:#000000;}
a.ttq_sortlink:hover, a#ttq_flush_history:hover {color:#F64809}
a.ttq_sortlink_active {color:#FDFF3F}";
cssStyle += ".ttq_sort_header {border-bottom:1px dashed #000000}";
cssStyle += ".ttq_research_later {display:block;}";
GM_addStyle(cssStyle);
detectLanguage();
/** ----------------------- Translations -------------------------------
* IMPORTANT!
* If there is no translation available for your language, the script will not
work!
* - aLangBuildings must list all names EXACTLY as they are printed on your
Travian web site. Names are case-sensitive.
* - aLangStrings[7] (= "level" in English) must read exactly what it is on your
website next to building names of higher level.
* - aLangStrings[11] (= "Current production:" in English) must read exactly what
it is on your website on the resource site pages.
* >>> Please submit all translations to xkx@w.cn <<<
* -------------------------------------------------------------------------
*/
switch(sLang) {
case "sk":
aLangBuildings = ["", "Drevorubač", "Hlinená baňa", "Železná baňa",
"Obilné pole", "Píla", "Tehelňa", "Zlievareň", "Mlyn", "Pekáreň", "Sklad surovín",
"Sýpka", "Kováčska dielňa", "Zbrojnica", "Aréna", "Hlavná budova", "Bod
stretnutia", "Trh", "Ambasáda", "Kasárne", "Stajne", "Dielňa", "Akadémia",
"Úkryt", "Radnica", "Rezidencia", "Palác", "Pokladňa", "Obchodný kancelár", "Veľké
kasárne", "Veľké stajne", "Mestské hradby", "Zemná hrádza", "Palisáda", "Kamenár",
"Pivovar", "Pasce", "Hrdinský dvor", "Veľký sklad", "Veľká sýpka", "Div sveta"];
aLangTasks = ["Postaviť", "Rozšíriť", "Zaútočiť na", "Vynájsť",
"Trénovať", "Transport", "Trade"];
aLangStrings = ["Postaviť neskôr", "Rozšíriť neskôr", "Zaútočiť
neskôr", "Vynájsť neskôr", "Naplánujte túto akciu na neskôr.", "Začali sme stavať
", " - úspech neznámy.", "stupeň", " sa nedá postaviť.", " sa nedá rozšíriť.",
"Úloha je naplánovaná.", "Aktuálna produkcia:", "Túto úlohu momentálne nie je
možné naplánovať.", "Momentálne nie je možné plánovať úlohy!", "Naplánované
úlohy", "Zmazať", "Vyslať neskôr", "Neboli vybraté žiadne jednotky.", "Jednotky
mašírujú do", "Nepodarilo sa vyslať jednotky do", "Podporiť", "Zaútočiť na",
"Olúpiť", "Katapulty zacieliť na", "náhodne", "o", "alebo za", "sekúnd", "minút",
"hodín", "dní", "Preskúmať jednotky a suroviny", "Preskúmať jednotky a obranné
objekty", "preč", "Útok nemožno naplánovať, pretože nie je známy cieľ.", "na
mieste č.", "Zoradiť podľa:", "typu ", "času ", "cieľa ", "iné ", "dediny ",
"História akcií", "zmazať históriu", "Začali sme vyvíjať ", " sa nedá vynájsť.",
"Vylepšiť neskôr", "Vyšpehovať", "Trénovať neskôr", "jednotky.", "Vytrénovať",
"Začali sme trénovať ", " sa nedá vytrénovať." ];
aLangTroops[0] = ["Legionár", "Pretorián", "Imperián", "Equites
Legáti", "Equites Imperatoris", "Equites Caesaris", "Rímske baranidlo", "Ohnivý
katapult", "Senátor", "Osadník", "Hrdina"]; //Romans
aLangTroops[1] = ["Pálkar", "Oštepár", "Bojovník so sekerou", "Špeh",
"Rytier", "Teuton jazdec", "Germánske baranidlo", "Katapult", "Kmeňový vodca",
"Osadník", "Hrdina"]; //Teutons
aLangTroops[2] = ["Falanx", "Šermiar", "Sliedič", "Theutates Blesk",
"Druid jazdec", "Haeduan", "Drevené baranidlo", "Trebušé", "Náčelník", "Osadník",
"Hrdina"]; //Gauls
aLangTransModel= ["MixedModel", "FoodOnly", "ResourceOnly",
"FixedModel"];
break;
厂", "铸造厂", "磨坊", "面包房", "仓库", "粮仓", "铁匠铺", "军械库", "竞技场", "村中心大楼",
"集结点", "市场", "大使 ", "兵营", "马厩", "工场", "研发所", "山洞", "市政厅", "行宫", "皇
后进行.", "开始建造或升级", " 已尝试但结果不明", "等级", " 不能建筑.", " 不能升级.", "此事项
出", "支援", "攻击", "抢夺", "投石车会瞄准", "随机", "于", "或之后", "秒", "分", "时",
编号:", "分 以:", " 型", "时间", "目标 ", "选项", "村庄", "任务历史记录", "清空历史记录",
" 训练失败."];
","预定时间强制平仓(无延时检测)"];
break;
case "cz":
aLangBuildings = ["", "Dřevorubec", "Hliněný důl", "Železný důl",
"Obilné pole", "Pila", "Cihelna", "Slévárna", "Mlýn", "Pekárna", "Sklad surovin",
"Sýpka", "Kovárna", "Zbrojnice", "Turnajové hřiště", "Hlavní budova",
"Shromaždiště", "Tržiště", "Ambasáda", "Kasárny", "Stáje", "Dílna", "Akademie",
"Úkryt", "Radnice", "Rezidence", "Palác", "Pokladnice", "Obchodní kancelář",
"Velké kasárny", "Velká stáj", "Městská zeď", "Zemní hráz", "Palisáda", "Kameník",
"Pivovar", "Pasti", "Hrdinský dvůr", "Velký sklad", "Velká sýpka", "Div světa"];
aLangTasks = ["Postavit", "Rozšířit", "Zaútočit na", "Vyzkoumat",
"Trénovat", "Transport", "Trade"];
aLangStrings = ["Postavit později", "Rozšířit později", "Zaútočit
později", "Vyzkoumat později", "Naplánujte tuto akci na později.", "Začali jsme
stavět ", " - výsledek je neznámý.", "úroveň", " se nedá postavit.", " se nedá
rozšířit.", "Úloha byla naplánována.", "Aktuální produkce:", "Tuto akci momentálně
není možné naplánovat.", "Momentálně není možné plánovat žádné akce!",
"Naplánované akce", "Smazat", "Vyslat později", "Útok není možné naplánovat,
protože nebyly vybrány žádné jednotky.", "Jednotky jsou na cestě do", "Nepodařilo
se vyslat jednotky do", "Podpořit", "Zaútočit na", "Oloupit", "Katapulty zamířit
na", "náhodně", "o", "anebo za", "sekund", "minut", "hodin", "dní", "Prozkoumat
jednotky a suroviny", "Prozkoumat jednotky a obranné objekty", "pryč", "Útok není
možné naplánovat, protože chybí cíl.", "na místě č.", "Třídit podle:", "druhu ",
"času ", "cíle ", "možnosti ", "vesnice ", "Historie", "smazat historii" ];
aLangTroops[0] = ["Legionář", "Pretorián", "Imperián", "Equites
Legáti", "Equites Imperatoris", "Equites Caesaris", "Římanské beranidlo", "Ohnivý
katapult", "Senátor", "Osadník"]; //Romans
aLangTroops[1] = ["Pálkař", "Oštěpař", "Sekerník", "Zvěd", "Rytíř",
"Teuton jezdec", "Germánské beranidlo", "Katapult", "Kmenový vůdce", "Osadník"];
//Teutons
aLangTroops[2] = ["Falanx", "Šermíř", "Slídič", "Theutates Blesk",
"Druid jezdec", "Haeduan", "Dřevěné beranidlo", "Válečný katapult", "Náčelník",
"Osadník"]; //Gauls
aLangTransModel= ["MixedModel", "FoodOnly", "ResourceOnly",
"FixedModel"];
break;
"集結點", "市場", "大使館", "兵營", "馬棚", "工場", "研究院", "山洞", "城鎮廳", "行宮", "皇
宮", "寶物庫", "交易所", "大兵營", "大馬棚", "城牆", "土牆", "木牆", "石匠鋪", "釀酒廠",
稍後執行.", "建築開始了 ", " 已嘗試但結果不明.", "等級", " 不能建築.", " 不能升級.", "此事項
能送去", "支援", "攻擊", "搶奪", "投石車會瞄準", "隨機", "於", "或之後", "秒", "分",
"坑洞編號:", "分類以:", "類型", "時間", "目標 ", "選項", "村莊", "任務歷史記錄", "清空歷史記
錄", "開始研發.", " 不能被研發.", "預定改良", "偵察兵", "預定訓練", "部隊", "訓練", "開始訓
機時間.","預定時間強制平倉(無延時檢測)"];
break;
case "tw":
aLangBuildings = ["", "伐木場", "泥坑", "鐵礦場", "農田", "鋸木廠", "磚廠",
"集結點", "市場", "大使館", "兵營", "馬棚", "工場", "研究院", "山洞", "城鎮廳", "行宮", "皇
宮", "寶物庫", "交易所", "大兵營", "大馬 ", "城牆", "土牆", "木牆", "石匠鋪", "釀酒廠", "陷
能送去", "支援", "攻擊", "搶奪", "投石車會瞄準", "隨機", "於", "或之後", "秒", "分",
"坑洞編號:", "分類以:", "類型", "時間", "目標 ", "選項", "村莊", "任務歷史記錄", "清空歷史記
錄", "開始研發.", " 不能被研發.", "預定改良", "偵察兵", "預定訓練", "部隊", "訓練", "開始訓
機時間.","預定時間強制平倉(無延時檢測)"];
break;
case "br":
aLangBuildings = ["", "Bosque", "Poço de Barro", "Mina de Ferro",
"Campo de Cereais", "Serraria", "Alvenaria", "Fundição", "Moinho", "Padaria",
"Armazém", "Celeiro", "Ferreiro", "Fábrica de Armaduras", "Praça de Torneios",
"Edifício principal", "Ponto de reunião militar", "Mercado", "Embaixada",
"Quartel", "Cavalaria", "Oficina", "Academia", "Esconderijo", "Casa do Povo",
"Residência", "Palácio", "Tesouraria", "Companhia do Comércio", "Grande
Quartel", "Grande Cavalaria", "Muralha", "Barreira", "Paliçada", "Pedreiro",
"Cervejaria", "Fábrica de Armadilhas", "Mansão do Herói", "Grande Armazém",
"Grande Celeiro", "Maravilha do Mundo"];
aLangTasks = ["Construir", "Melhorar", "Atacar", "Desenvolver",
"Treinar", "Transport", "Trade"];
aLangStrings = ["Construir mais tarde", "Melhorar mais tarde", "Atacar
mais tarde", "Desenvolver mais tarde", "Programar esta tarefa para mais tarde.",
"Começamos a construir ", "Foi tentada a tarefa mas com resultado desconhecido.",
"Nível", " não pode ser construído.", "Não pode ser melhorado.", "A tarefa foi
programada.", "Em construção:", "Não conseguimos programar esta tarefa agora.",
"Programação de tarefas não está disponível!", "Tarefas Programadas", "Apagar",
"Enviar mais tarde", "Não foram selecionadas tropas.", "As tuas tropas foram
enviadas para", "Não foi possível enviar as tuas tropas para", "Reforços",
"Ataque:normal", "Ataque:assalto", "O alvo das Catapultas será", "Aleatório",
"ŕs", "ou depois","segundos", "minutos", "horas", "dias","Espiar recursos e
tropas", "Espiar defesas e tropas", "Ausente", "O ataque não pode ser programado
pois nenhum destino foi escolhido.", "na localização nş.", "Sort by:", "type ",
"time ", "target ", "options ", "village "];
aLangTroops[0] = ["Legionário", "Pretoriano", "Imperiano", "Equites
Legati", "Equites Imperatoris", "Equites Caesaris", "Aríete", "Catapulta de Fogo",
"Senador", "Colonizador"]; //Romans
aLangTroops[1] = ["Salteador", "Lanceiro", "Bárbaro", "Espião",
"Paladino", "Cavaleiro Teutão", "Aríete", "Catapulta", "Chefe", "Colonizador"];
//Teutons
aLangTroops[2] = ["Falange", "Espadachim", "Batedor", "Trovão
Theutate", "Cavaleiro Druida", "Haeduano", "Aríete", "Trabuquete", "Chefe de Clã",
"Colonizador"]; //Gauls
aLangTransModel= ["Modo Misturado", "Cereal Somente", "Recursos
Somente", "Modo Fixo"];
break;
case "ae":
aLangBuildings = ["", "," "حقل القمح," "منجم حديد," "حفرة الطي,"الطاب
," "مزن البوب," "مزن," "مبز," "الطاحن," "حديد مسبك," "اعمال البناء,""معمل النشارة
," "السوق," "نقطة التجمع," "البن الرئيسي," "ساحة البطولة," "مستوع السلحة,""حداد
," "اسطبل كبي," "ثكنة كبية," "الكتب التجاري," "غرفة الكنز," "قصر," "السكن,""البلدية
," "قصر البطال," "الصياد," "مصنع العصي," "الجار," "الاجز," "سور القرية,""سور القريه
;]""بيع
" ," "الستوى," "سطو غي معروف النتائج,""سوف يبدء النشاء," "جدولة الهام اللحقة,"لحقا
"ل يكن جدولة هذه," "العمل احال," "ت جدولة الهام," " ليكن التطوير,"ليكن النشاء
," "ارسال لحقا," "حذف," "اعمال مدوله," "مهم مدولة غي متاحة,".الهمه الن
," "غارة," "هجوم," "دعم," "جيوشك ل يكن ارسالا ال,""جيوشك ل يكن ارسالا ال,""الخبار
"ل يكن جدولة الجوم لن," "الطريقة," "التجسس على اليوش و الدفعات,"اليوش و الوارد
," "الوقت," "نوع,": "الفرز بواسطة,""ل يوجد ف ذلك الكان,"النطقة الددة غي دقيقة
" ," "سوف يبدا اعدة البحث," "سجل النتصارات," "سجل الهام," "قرى," "خيارات," "الدف
االتعديلl"];
"عدد التجار," "الهم تنفذ," "اضيف ذلك,": "الوقت التبقي للشحن التال," "مرة,":النقل
"مصدر القمح," "الهم الحقه," "خطا ف النقل,"غي كفي: ", "Autotrade has done.",
"Autotrade failed.", "," "تقسيم ميساوي," "قمح," "حديد," "طي," "خشب,":مصدر الوارد
تغيي القرية الساسية غي مستحب: "تنبيه,":""طريقة التقسيم, "Keep ZERO if you want to
division equal among wood, clay and iron. fill the number otherwise.", "هذا هو وقت
case "se":
aLangBuildings = ["", "Skogshuggare", "Lergrop", "Järngruva",
"Vetefält", "Sagverk", "Murbruk", "Järngjuteri", "Vetekvarn", "Bageri", "Magasin",
"Silo", "Smedja", "Vapenkammare", "Tornerplats", "Huvudbyggnad", "Samlingsplats",
"Marknadsplats", "Ambassad", "Baracker", "Stall", "Verkstad", "Akademi", "Grotta",
"Stadshus", "Residens", "Palats", "Skattkammare", "Handelskontor", "Stor barack",
"Stot stall", "Stadsmur", "Jordvall", "Palissad", "Stenhuggare", "Bryggeri",
"Fälla", "Hjältens egendom", "Stort magasin", "Stor silo", "Världsunder"];
aLangTasks = ["Konstruera", "Uppgradera", "Attack", "Förbättra",
"Träna", "Transport", "Trade"];
aLangStrings = ["Konstruera senare", "Uppgradera senare", "Attackera
senare", "Förbättra senare", "Schemalägg uppgiften tills senare.", "Byggnationen
pabörjad ", " utfördes med okänt resultat.", "niva", " kan inte byggas.", " kan
inte uppgraderas.", "Uppgiften är schemalagd.", "Nuvarande produktion:", "Det gar
inte att schemalägga denna uppgift just nu.", "Schemaläggningen är inte
tillgänglig!", "Schemalägg uppgift", "Ta bort", "Skicka senare", "Attacken kunde
inte bli schemalagd da inga trupper valdes.", "Dina trupper skickades till", "Dina
trupper kunde inte skickas till", "Support", "Attack", "Plundring", "Katapulterna
ska sikta pa", "random", "vid", "eller efter", "sekunder", "minuter", "timmar",
"dagar", "Spionera pa trupper och resurser", "Spionera pa trupper och försvar",
"borta", "Attacken misslyckades, var vänlig och välj en destination.", "ingen
destination.", "Sortera efter:", "typ ", "tid ", "mal ", "alternativ ", "by ",
"tidigare"];
aLangTroops[0] = ["Legionär", "Praetorian", "Imperiesoldat", "Sparare",
"Imperieriddare", "Ceasarriddare", "Murbräcka", "Eld Katapult", "Senator",
"Nybyggare", "Hjälte"]; //Romans
aLangTroops[1] = ["Klubbman", "Spjutman", "Yxman", "Scout", "Paladin",
"Germansk Knekt", "Murbräcka", "Katapult", "Stamledare", "Nybyggare", "Hjälte"];
//Teutons
aLangTroops[2] = ["Falanx", "Svärdskämpe", "Sparare", "Theutates
Blixt", "Druidryttare", "Haeduan", "Murbräcka", "Krigskatapult", "Hövding",
"Nybyggare", "Hjälte"]; //Gauls
aLangTransModel= ["MixedModel", "FoodOnly", "ResourceOnly",
"FixedModel"];
break;
case "uk":
aLangBuildings = ["", "Woodcutter", "Clay Pit", "Iron Mine", "Wheat
Field", "Sawmill", "Brickyard", "Iron Foundry", "Flour Mill", "Bakery",
"Warehouse", "Granary", "Blacksmith", "Armoury", "Tournament Square", "Main
Building", "Rally Point", "Marketplace", "Embassy", "Barracks", "Stable", "Siege
Workshop", "Academy", "Cranny", "City Hall", "Residence", "Palace", "Treasury",
"Trade Office", "Great Barracks", "Great Stable", "City Wall", "Earth Wall",
"Palisade", "Stonemason", "Brewery", "Trapper", "Hero's Mansion", "Great
Warehouse", "Great Granary", "Wonder"];
aLangTasks = ["Build", "Upgrade", "Attack", "Research", "Train",
"Transport", "Trade"];
aLangStrings = ["Build later", "Upgrade later", "Attack later",
"Research later", "Schedule this task for later.", "We started builing ", " was
attempted with unknown result.", "level", " cannot be built.", " cannot be
upgraded.", "The task was scheduled.", "Current production:", "We can't schedule
this task right now.", "Task scheduling is not available!", "Scheduled Tasks",
"Delete", "Send later", "The attack cannot be scheduled because no troops were
selected.", "Your troops were sent to", "Your troops could not be sent to",
"Support", "Attack", "Raid", "Catapults will aim at", "random", "at", "or after",
"seconds", "minutes", "hours", "days", "Spy for resources and troops", "Spy for
troops and defenses", "away", "The attack cannot be scheduled because no
destination was specified.", "at site no.", "Sort by:", "type ", "time ", "target
", "options ", "village "];
aLangTroops[0] = ["Legionnaire", "Praetorian", "Imperian", "Equites
Legati", "Equites Imperatoris", "Equites Caesaris", "Battering Ram", "Fire
Catapult", "Senator", "Settler", "Hero"]; //Romans
aLangTroops[1] = ["Maceman", "Spearman", "Axeman", "Scout", "Paladin",
"Teutonic Knight", "Ram", "Catapult", "Chief", "Settler", "Hero"]; //Teutons
aLangTroops[2] = ["Phalanx", "Swordsman", "Pathfinder", "Theutates
Thunder", "Druidrider", "Haeduan", "Ram", "Trebuchet", "Chieftain", "Settler",
"Hero"]; //Gauls
aLangTransModel= ["MixedModel", "FoodOnly", "ResourceOnly",
"FixedModel"];
break;
case "il":
case "en":
case "com":
default: // default is english
aLangBuildings = ["", "Woodcutter", "Clay Pit", "Iron Mine",
"Cropland", "Sawmill", "Brickyard", "Iron Foundry", "Grain Mill", "Bakery",
"Warehouse", "Granary", "Blacksmith", "Armoury", "Tournament Square", "Main
Building", "Rally point", "Marketplace", "Embassy", "Barracks", "Stable",
"Workshop", "Academy", "Cranny", "Townhall", "Residence", "Palace", "Treasury",
"Trade Office", "Great Barracks", "Great Stable", "City Wall", "Earth Wall",
"Palisade", "Stonemason", "Brewery", "Trapper", "Hero's Mansion", "Great
Warehouse", "Great Granary", "Wonder"];
aLangTasks = ["Build", "Upgrade", "Attack", "Research", "Train",
"Transport", "Trade"];
aLangStrings = ["Build later", "Upgrade later", "Attack later",
"Research later", "Schedule this task for later.", "We started builing ", " was
attempted with unknown result.", "level", " cannot be built.", " cannot be
upgraded.", "The task was scheduled.", "Current production:", "We can't schedule
this task right now.", "Task scheduling is not available!", "Scheduled Tasks",
"Delete", "Send later", "No troops were selected.", "Your troops were sent to",
"Your troops could not be sent to", "Support", "Attack", "Raid", "Catapults will
aim at", "random", "at", "or after", "seconds", "minutes", "hours", "days", "Spy
for resources and troops", "Spy for troops and defenses", "away", "The attack
cannot be scheduled because no destination was specified.", "at site no.", "Sort
by:", "type ", "time ", "target ", "options ", "village ", "Task History", "flush
history", "We started researching ", " cannot be researched."];
aLangTroops[0] = ["Legionnaire", "Praetorian", "Imperian", "Equites
Legati", "Equites Imperatoris", "Equites Caesaris", "Battering Ram", "Fire
Catapult", "Senator", "Settler", "Hero"]; //Romans
aLangTroops[1] = ["Clubswinger", "Spearman", "Axeman", "Scout",
"Paladin", "Teutonic Knight", "Ram", "Catapult", "Chief", "Settler", "Hero"];
//Teutons
aLangTroops[2] = ["Phalanx", "Swordsman", "Pathfinder", "Theutates
Thunder", "Druidrider", "Haeduan", "Ram", "Trebuchet", "Chieftain", "Settler",
"Hero"]; //Gauls
aLangTransModel= ["MixedModel", "FoodOnly", "ResourceOnly",
"FixedModel"];
aLangStringt = ["RecruitHome", "AutoTransport", "AutoTrade",
"Businessmen", "From", "To", "TransportBy", "RepeatTime", "minutes", "seconds",
"TransportTimes:", "times", "The Time Of Next Transport:", "has been added.", "has
been started.", "has not enough businessmen.", "transport error.", "Schedule later
after", "Corn Resource: ", "Autotrade has done.", "Autotrade failed.", "Target
Resource:", "Wood", "Clay", "Iron", "Crop", "Division Equal", "Division Model:",
"WARN: Chang source village is not recommend.", "Keep ZERO if you want to division
equal among wood, clay and iron. fill the number otherwise.", "This is the server
time.", "This is your local time.","Force Trade On Scheduled Time (no delay
check)"];
break;
/**
* Custom log function .
* @param {int} level
* @param:{int} msg Message to log.
*/
function _log(level, msg) {
if (level <= LOG_LEVEL && navigator.userAgent.indexOf("Opera") == -1)
GM_log(msg);
}
function checkSetTasks() {
_log(2, "Checking set tasks...");
_log(3, "oIntervalReference " + oIntervalReference);
if(bLocked) {
_log(3, "The TTQ_TASKS cookie is locked. We are not able to write
it.");
return false;
}
bLocked = true;
var data = readCookie("TTQ_TASKS");
if(data == '') { // no tasks are set
_log(2, "No tasks are set. ");
// stop checking, it would be pointless. Checking will be restarted
when new tasks are set.
if(oIntervalReference) {
_log(3, "clearInterval()");
window.clearInterval(oIntervalReference);
oIntervalReference = null;
}
bLocked = false;
return false;
}
// The stored time (Unix GMT time) should be compared against the GMT
time, not local!
if(aThisTask[1] <= oDate.getTime()/1000) {
_log(2, "Triggering task: " + aTasks[i]);
triggerTask(aThisTask);
///////////////////////////resource auto transportor/////////////////
if (aThisTask[0]!=5){ //modify or delete the transport task at last step in
addToHistory()
aTasks.splice(i, 1); //delete this task
bTaskDeleted = true;
}
///////////////////////////resource auto transportor/////////////////end
// aTasks.splice(i, 1); //delete this task
} else if( (aThisTask[0] < 2) && (aThisTask[1] <=
((oDate.getTime()/1000) + iPreloadTime)) ) { //prefetch the code if the task is
to be triggered in less than iPreloadTime
_log(2, "Some building/upgrading task is set, but it is not
the time yet. It is time to preload the code though.");
getCode(aThisTask[2], aThisTask[4]);
} else {
_log(2, "Some task is set, but it is not the time yet.");
//refresh the session if needed
var sLastRefreshed = getOption('LAST_REFRESH', 0, "integer");
var iRandomMultiplier = (Math.random() < 0.5) ? 1 : -1;
var iRandomMilliSeconds = iRandomMultiplier * 60000 *
Math.round(10 * Math.random()); //for randomizing the refresh times (the scatter
will be +/- 10 minutes)
if(sLastRefreshed != '' && (iSessionRefreshRate > 0) &&
(sLastRefreshed + (iSessionRefreshRate * 60000) + iRandomMilliSeconds ) <
oDate.getTime() ) {
_log(2, "Refreshing the session...");
doget("dorf1.php", null, null)
setOption('LAST_REFRESH', oDate.getTime() );
}
}
}
function refreshTaskList(aTasks) {
_log(3, "-> refreshTaskList()");
//Sort links
var currentSort = getOption("TASKLIST_SORT", 1, "integer");
var sortLinkWrapper = document.createElement("div");
sortLinkWrapper.innerHTML += "<span class='ttq_sort_header'>» "
+t("Sort by:")+ "</span> ";
var sortKeys = [1,4,0,2]; //order is important
var sortLabels = ["type ", "time ", "target ", "option ", "village "]
sortKeys.forEach(function(el) {
var sortLink = document.createElement("a");
sortLink.innerHTML = t(sortLabels[el]);
sortLink.className = (currentSort == el) ? "ttq_sortlink_active" :
"ttq_sortlink";
sortLink.href = "#";
sortLink.addEventListener("click", function(ev) {
orderList(el, "ttq_task_row");
setOption("TASKLIST_SORT", el);
var siblings = ev.target.parentNode.childNodes;
for(var j = 0; j < siblings.length; j++) {
if(siblings[j].nodeName == "A") {siblings[j].className =
"ttq_sortlink";}
}
ev.target.className = "ttq_sortlink_active";
}, false);
sortLinkWrapper.appendChild(sortLink);
oTaskList.appendChild(sortLinkWrapper);
sortLink = null;
}
);
document.body.appendChild(oTaskList);
makeDraggable($('ttq_draghandle'));
oTaskRow.appendChild(oDeleteLink);
oTaskList.appendChild(oTaskRow);
//add listener for editing times in the task list
var oTaskTimeSpan = $("ttq_tasktime_"+i);
oTaskTimeSpan.addEventListener("click", editTime, false);
oDeleteLink = null;
oTaskRow = null;
oDate = null;
}
orderList(currentSort, "ttq_task_row");
function refreshHistory(aTasks) {
_log(3, "Refreshing history...");
// Remove old history
var oOldHistory = $("ttq_history");
if(oOldHistory) {document.body.removeChild(oOldHistory)};
document.body.appendChild(oHistory);
makeDraggable($('ttq_history_draghandle'));
orderList(1, "ttq_history_row");
//flush link
var oFlushLink = document.createElement('a');
oFlushLink.id = 'ttq_flush_history';
oFlushLink.innerHTML = t('flush history');
oFlushLink.href = '#';
oHistory.appendChild(oFlushLink);
oFlushLink.addEventListener('click', flushHistory, false);
}
oDate = null;
return oHistoryRow;
}
/**
* @param iORderBy: 0 - tasktype, 1 - timestamp, 2 - target, 3 - options, 4 -
villagedid
*/
function orderList (iOrderBy, sRowId) {
var rows = xpath('//div[contains(@id, "' +sRowId+ '")]');
if(rows.snapshotLength > 0) {
switch(iOrderBy) {
case 0:
var sortKey = "tasktype";
break;
case 2:
var sortKey = "target";
break;
case 3:
var sortKey = "options";
break;
case 4:
var sortKey = "villagedid";
break;
case 1:
default:
var sortKey = "timestamp";
break;
}
var keyValue = "";
var aRows = [];
for(var i = 0; i < rows.snapshotLength; i++) {
keyValue = rows.snapshotItem(i).getAttribute(sortKey);
aRows.push([keyValue, rows.snapshotItem(i)]);
}
aRows.sort(sortArray);
switch(sRowId) {
case "ttq_history_row":
aRows.forEach(processSortedHistory);
break;
case "ttq_task_row":
default:
aRows.forEach(processSortedTaskList);
break;
}
return false;
} else {
return;
}
function sortArray(arr1,arr2) {
return arr1[0] - arr2[0];
}
function processSortedTaskList(element) {
$("ttq_tasklist").appendChild(element[1]);
}
function processSortedHistory(element) {
$("ttq_history").appendChild(element[1]);
}
function editTime(ev) {
var oTaskRow = ev.target.parentNode.parentNode;
var type = parseInt(oTaskRow.getAttribute("tasktype"));
var timestamp = oTaskRow.getAttribute("timestamp");
var target = oTaskRow.getAttribute("tasktarget");
var options = oTaskRow.getAttribute("taskoptions").split("_");;
var villagedid = oTaskRow.getAttribute("villagedid"); //not supported yet.
The new task will have did of currently active village.
function deleteTask(e) {
_log(3, "-> deleteTask()");
var iTaskIndex = e.target.parentNode.getAttribute("itaskindex");
_log(2, "Deleting task "+iTaskIndex);
if(bLocked) {
_log(3, "The TTQ_TASKS cookie is locked. We are not able to write
it.");
return false;
}
bLocked = true;
var data = readCookie("TTQ_TASKS");
if(data == '') {
_log(2, "No tasks are set. ");
bLocked = false;
return false; // no tasks are set
}
var aTasks = data.split("|");
aTasks.splice(iTaskIndex, 1); //delete this task
data = aTasks.join("|");
createCookie("TTQ_TASKS", data);
bLocked = false;
refreshTaskList(aTasks);
return false; // we return false to override default action on the link
_log(3, "<- deleteTask()");
}
/**
* Schedules the specified task. The task is stored in a cookie.
* @param iTask: name of the task (0-build, 1-upgrade, 2-attack, 3-research)
* @param iWhen: date when the task is to be triggered
* @param target: iBuildingId, or iVillageId
* @param options: what to build, what units to send attacking (first member
specifies the type of attack: 0-support, 1-normal attack, 2-raid).
*/
function setTask(iTask, iWhen, target, options) {
_log(3, "-> setTask()");
if (iTask==5){
var iVillageId = target;
}else{
var iVillageId = getActiveVillage();
}
if(bLocked) {
_log(3, "The TTQ_TASKS cookie is locked. We are not able to write
it.");
return false;
}
bLocked = true;
var data = readCookie("TTQ_TASKS");
var oldValue = (data == null || data.length <= 1 || data == '') ? '' : data
+ '|';
var newValue = oldValue + iTask + ',' + iWhen + ',' + target + ',' +
options;
if(iVillageId) {
newValue += ',' + iVillageId;
} else {
newValue += ',' + 'null';
}
_log(2, "Writing cookie: "+newValue);
if(!createCookie("TTQ_TASKS", newValue)) {
printMsg("<span class='ttq_village_name' style='display:block;'>"
+getVillageName(iVillageId)+ "</span>" +t("We can't schedule this task right
now."), true);
bLocked = false;
return false;
}
bLocked = false;
// Generate message
var sTaskSubject = "";
var sTask = "";
switch(iTask) {
case "0": //build
case "1": //upgrade
sTaskSubject = aLangBuildings[options];
sTask = aLangTasks[iTask];
break;
case "2": //attack
sTaskSubject = '<span id="ttq_placename_' +target+ '">'
+getPlaceName(target)+ '</span>';
var aTroops = options.split("_");
if(onlySpies(aTroops)) {
sTask = t("Spy");
} else {
var iIndex = parseInt(aTroops[0]) + 18;
if(iIndex == 20) sTask = t('Support');
if(iIndex == 21) sTask = t('Attack');
if(iIndex == 22) sTask = t('Raid');
}
break;
case "3": //research
sTaskSubject = aLangTroops[iMyRace][options-1];
sTask = aLangTasks[3];
break;
case "4": //training
var aTroops = options.split("_");
sTaskSubject = getTroopsInfo(aTroops);
sTask = t('Train');
"break;"
///////////////////////////resource auto transportor/////////////////
case "5":
var aTrans = options.split("_");
sTaskSubject =
tt("To")+"("+aTrans[0]+"|"+aTrans[1]+")"+tt("hasbeenadded");
sTask = tt("AutoTransport");
break;
case "6":
sTaskSubject = tt("AutoTrade")+tt("hasbeenadded");
sTask = aLangTasks[6];
break;
///////////////////////////resource auto transportor/////////////////end
default:
break;
}
/**
* Performs the supplied task. Prints the report.
* @param aTask: [task, when, target, options]
*/
function triggerTask(aTask) {
_log(3, "-> triggerTask()");
switch(aTask[0]) {
case "0":
//build new building
build(aTask);
break;
case "1":
// upgrade building
upgrade(aTask);
break;
case "2":
// upgrade building
attack(aTask);
break;
case "3":
//research
research(aTask);
break;
case "4":
//train troops
train(aTask);
break;
///////////////////////////resource auto transportor/////////////////
case "5":
//trans resource
trans(aTask);
break;
case "6":
//trade resource
trade(aTask);
break;
///////////////////////////resource auto transportor/////////////////end
default:
//do nothing
_log(3, "Can't trigger an unknown task.");
break;
}
_log(3, "<- triggerTask()");
}
function build(aTask) {
_log(3, "-> build()");
// we will assume that there is a correct up-to-date code in the cookie
var sCode = '';
//TODO: if the code is not there, or is there but incorrect, try to get a
new one, register event listener, and start building when the code is updated
(implement timeouts to this)
if(aTask[4] != 'null') {
var sNewDid = "&newdid=" +aTask[4];
} else {
var sNewDid = "";
}
function upgrade(aTask) {
_log(3, "-> upgrade()");
if(aTask[4] != 'null') {
var sNewDid = "&newdid=" +aTask[4];
} else {
var sNewDid = "";
}
function attack(aTask) {
_log(3, "-> attack()");
var aTroops = new Array(); //extract troops numbers and attack type
aTroops = aTask[3].split("_");
var iAttackType = aTroops[0];
//Spying missions
var iScoutUnit = getOption("SCOUT_UNIT", false, "integer");
if(iScoutUnit != 3 && iScoutUnit != 4) { //3 or 4 are the only valid values
_log(2, "Unknown iScoutUnit. Unable to proceed with sending this
attack.");
return false;
}
if(aTroops[iScoutUnit] > 0 && onlySpies(aTroops) && iAttackType > 2) {
_log(3, "We are sendings scouts.");
if(aTroops[12]) {
var iScoutMode = aTroops[12];
} else {
var iScoutMode = 1; //"Spy troops and resources" by default
}
sParams += "&spy=" +iScoutMode;
}
_log(3, "sParams\n"+sParams);
function research(aTask) {
_log(3, "-> research()");
if(aTask[4] != 'null') {
var sNewDid = "&newdid=" +aTask[4];
} else {
var sNewDid = "";
}
var currentActiveVillage = getActiveVillage();
var sUrl = "build.php?id=" + aTask[2] + "&a=" + aTask[3] + sNewDid;
var myOptions = [aTask, currentActiveVillage];
doget(sUrl, handleRequestResearch, myOptions);
function train(aTask) {
_log(3, "-> train()");
if(aTask[4] != 'null') {
var sNewDid = "&newdid=" +aTask[4];
} else {
var sNewDid = "";
}
var currentActiveVillage = getActiveVillage();
/**
* @param options: [aTask, iCurrentActiveVillage] (optional) OR sNewdid in case of
finding the code for construction.
*/
function doget(url, callback, options) {
var httpRequest = new XMLHttpRequest();
if(callback) {
httpRequest.onreadystatechange = function() {
callback(httpRequest, options);
};
}
httpRequest.open("GET", url, true);
httpRequest.send(null);
}
if (httpRequest.readyState == 4) {
if (httpRequest.status == 200) { // ok
var sResponse = httpRequest.responseText;
_log(3, sResponse);
if(!sResponse) { // error retrieving the response
if (httpRequest.readyState == 4) {
if (httpRequest.status == 200) {
var sResponse = httpRequest.responseText;
_log(3, sResponse);
if(!sResponse) { // error retrieving the response
findCode(sResponse, sNewdid);
return false;
} else { // failed
_log(2, "HTTP request status: " + httpRequest.status);
}
}
_log(3, "<- handleRequestFindCode()");
}
function switchActiveVillage(did) {
_log(2, "Switching your village back to " +did);
if(!isInt(did)) {return; }
doget("dorf1.php?newdid="+did, null, null);
return;
}
/**
* Adds task to the log DIV.
* @param bSuccess: true if the task was successfully performed.
*/
function addToHistory(aTask, bSuccess) {
_log(3, "Adding to history...");
if(iHistoryLength < 1) { return; }
bLockedHistory = true;
var data = readCookie("TTQ_HISTORY");
/**
* This only trims the value read from cookie. Cookie itself is trimmed when new
event is entered into history.
* It trimms the value down to maxlength.
*/
function trimHistory(data, maxlength) {
if(data != '' && data.length > 0) {
//trim history as needed
data = data.split("|");
var excessTasks = data.length - maxlength;
if(excessTasks > 0) {
data.splice(0, excessTasks);
}
return data.join("|");
}
return data;
}
function flushHistory() {
createCookie("TTQ_HISTORY", "");
refreshHistory();
}
function createBuildLinks() {
_log(3, "-> createBuildLinks()");
var iSiteId = getBuildingId();
if(iSiteId == false) {return false;}
if(iTask == 0)
{xpathBuildingNames.snapshotItem(i).nextSibling.nextSibling.appendChild(oLink);}
else if(iTask == 1)
{xpathBuildingNames.snapshotItem(i).parentNode.nextSibling.nextSibling.appendChild
(oLink);}
} else {
_log(2, "Building name found, but it was not identified in the
building list.\n");
}
}
function createAttackLinks() {
_log(3, "-> createAttackLinks()");
}
}
function createResearchLinks() {
_log(3, "-> createResearchLinks()");
var re = /.*build\.php\?id=([0-9]{1,2})/i;
var sLocation = window.location.href;
var iSiteId = getBuildingId();
if(iSiteId == false) {return false;}
//build links
_log(2, "Adding research later links...");
var Imgs =
xpath("id('lmid2')/form/table[1]/tbody/tr/td[1]/table/tbody/tr[1]/td[1]/img");
var Cells = xpath("//form/table[1]/tbody/tr/td[2]/div |
//form/table[1]/tbody/tr/td[2]/a");
for(var i = 0; (i < Imgs.snapshotLength) && (i < Cells.snapshotLength); i++)
{
var thisImg = Imgs.snapshotItem(i);
var thisCell = Cells.snapshotItem(i);
var iTroopId = thisImg.src.match(/([0-9]{1,2})\.gif/i);
if(!iTroopId) { break; }
iTroopId = iTroopId[1];
if(iTroopId > 20) {
iTroopId = iTroopId - 20;
} else if(iTroopId > 10) {
iTroopId = iTroopId - 10;
}
function createTrainLinks() {
_log(3, "-> createTrainLinks()");
var re = /.*build\.php\?id=([0-9]{1,2})/i;
var iSiteId = getBuildingId();
if(iSiteId == false) {return false;}
if(bIsResidence) {
_log(2, "Adding train later links for residence/palace...");
var trainBtn = xpath("//p[2]/input[@type='image']");
if(trainBtn.snapshotLength > 0) { //we need to build only the button
_log(2, "Adding train later links for
residence/palace...");
var oBtn = document.createElement("input");
oBtn.type = "button";
oBtn.value = linkTxt;
oBtn.style.margin = "3px 6px";
oBtn.addEventListener("click", scheduleTraining, false);
trainBtn.snapshotItem(0).parentNode.appendChild(oBtn);
} else { //we need to build the textbox
//get the code. No code - no training
var iCode = xpath("id('lmid2')/form//input[@name='z']");
if(iCode.snapshotLength < 1) {
_log(3, "No code available. No train later link
available.");
return false;
}
} else {
_log(2, "Adding train later links for
barracks/stables/workshop...");
var trainBtn = xpath("id('lmid2')/form/p/input[@type='image']");
if(trainBtn.snapshotLength < 1) { //button not found
_log(2, "The Train button not found. Exiting function...");
return false;
}
var oBtn = document.createElement("input");
oBtn.type = "button";
oBtn.value = linkTxt;
oBtn.style.margin = "3px 6px";
oBtn.addEventListener("click", scheduleTraining, false);
trainBtn.snapshotItem(0).parentNode.appendChild(oBtn);
}
function scheduleAttack(e) {
_log(3, "-> scheduleAttack()");
if(iVillageId == null) {
_log(2, "Target village ID not found.");
printMsg(t("The attack cannot be scheduled because no destination was
specified."), true);
return false;
}
sXpathExpr = "//table[@class='p1']//table//td/input[@type='text']";
xpathRes = xpath(sXpathExpr);
if(bNoTroops) {
_log(2, "No troops were selected. Unable to schedule the
attack.");
printMsg(t("The attack cannot be scheduled because no troops were
selected.") , true);
return false;
}
function scheduleTraining(e) {
var Inputs = xpath("id('lmid2')//table//input[@type='text']");
if(Inputs.snapshotLength < 1 ) {
_log(3, "No textboxes with troop numbers found.");
return false;
}
var buildingId = getBuildingId();
var aTroops = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; //the first member is the
code
var bNoTroops = true;
for(var i = 0; i < Inputs.snapshotLength; i++) {
var thisTroopType = parseInt(Inputs.snapshotItem(i).name.substring(1));
aTroops[thisTroopType] = (Inputs.snapshotItem(i).value != '') ?
Inputs.snapshotItem(i).value : 0;
if(Inputs.snapshotItem(i).value && Inputs.snapshotItem(i).value != 0)
{bNoTroops = false;}
}
if(bNoTroops) {
_log(2, "No troops were selected. Unable to schedule the
attack.");
printMsg(t("No troops were selected.") , true);
return false;
}
//currently, only 1 kind of troop can be trained at once - null all elements
except for the oth one (code) and the first non-zero value
var somethingFound = false;
aTroops.forEach(function(element, index) {
if(index > 0 && element > 0) {
if(somethingFound) aTroops[index] = 0;
somethingFound = true;
}
})
/**
* @param iTask: 0 - build, 1 - upgrade, 2 - attack,raid,support
* @param target: sitedId for iTask = 0 or 1; iVillageId for siteId = 2
* @param options: buildingId for iTask = 0; troops for attacks.
* @param timestamp: if it is passed, suggest the time calculated from this
(Caution! It is in seconds).
* This function functions both as a Listener for Build later and Upgrade later
links,
* and as regular function when arguments are supplied (in case of scheduling
attacks and editing existing tasks).
*/
function displayTimerForm(iTask, target, options, timestamp) {
_log(3, "-> displayTimerForm()");
// For build and upgrade, we need to extract arguments from the event object
if(timestamp) {
var date = new Date(timestamp * 1000);
} else {
var date = new Date();
///////////////////////////resource auto transportor/////////////////
if (iTask==5){
date = new Date(date.getTime()+nseconds*1000);
}
///////////////////////////resource auto transportor/////////////////end
}
var dd = date.getDate();
var mm = date.getMonth() + 1;
var yyyy = date.getFullYear();
var hh = date.getHours();
var min = date.getMinutes();
var sec = date.getSeconds();
}
// Allow target selection for catapults if this is not support and at least
1 cata is sent
var sCataTargets = '';
if(iTask == 2 && iAttackType > 20 && bCatapultPresent) {
var sCataOptions = "";
for(var j=1; j < aLangBuildings.length; j++) {
sCataOptions += '<option value="' +j+ '">' +aLangBuildings[j]+
'</option>';
}
sCataTargets = '<select name="kata" size="" class="f8"><option
value="99">' +t("random")+ '</option>' + sCataOptions + '</select>';
sCataTargets += '<select name="kata2" size="" class="f8"><option
value="99">' +t("random")+ '</option>' + sCataOptions + '</select>';
}
//Allow specifying the spying mode (only if there is nothing but spies being
sent and if this is not a support)
var sSpyMode = '';
if(iTask == 2 && iAttackType > 20 && bOnlySpies) {
sSpyMode = '<input type="radio" name="spy" value="1" checked>' +t("Spy
for resources and troops")+ ' <input type="radio" name="spy" value="2">' +t("Spy
for troops and defenses");
}
oTimerForm.id = "timerForm";
oTimerForm.setAttribute("class", "handle");
var sLinkClose = "<a href='#'
onclick='document.body.removeChild(document.getElementById(\"timerform_wrapper\"))
;' class='ttq_close_btn'><img src='" +sCloseBtn+ "' alt='X' /></a>";
if(sCataTargets != '') {
oTimerForm.innerHTML += '<p>' + t("Catapults will aim at") + ': '
+sCataTargets+ ' </p>';
}
if(sSpyMode != '') {
oTimerForm.innerHTML += '<p>' +sSpyMode+ '</p>';
}
//position
var formCoords = getOption("FORM_POSITION", "215px_215px");
formCoords = formCoords.split("_");
oWrapper.style.top = formCoords[0];
oWrapper.style.left = formCoords[1];
document.body.appendChild(oWrapper);
makeDraggable($("timerForm"));
_log(3, "<- displayTimerForm()");
return false;
}
function handleTimerForm(oForm) {
_log(3, "-> handleTimerForm()");
var at = oForm.at.value;
if(at == '') {
var after = oForm.after.value;
var timeUnit = oForm.timeUnit.value;
after = after*timeUnit; // convert to seconds
var oDate = new Date(); // current GMT date. TODO: server time
var iTaskTime = parseInt(oDate.getTime()/1000 + after);
} else {
// convert formatted date to milliseconds
var re = new RegExp("^(2[0-9]{3})/([0-9]{1,2})/([0-9]{1,2}) ([0-
9]{1,2}):([0-9]{1,2}):([0-9]{1,2})$", "i");
var aMatch = at.match(re);
if(!aMatch) {
_log(1, "You entered invalid format of date!");
return;
}
for(var i = 2; i < aMatch.length; i++) {
// convert strings to integers
if(aMatch[i].match(/0[0-9]{1}/i)) {aMatch[i] =
aMatch[i].substring(1);}
aMatch[i] = parseInt(aMatch[i]);
}
document.body.removeChild($('timerform_wrapper'));
_log(2, "Task will be scheduled for " +iTaskTime); // The stored time
is the absolute Unix GMT time.
function printMsg(sMsg,bError) {
_log(3, "-> printMsg()");
var oDate = new Date();
var sWhen = oDate.toLocaleString() + "\n";
_log(2, sWhen + sMsg);
//alert(sMsg);
function hideMsg() {
_log(3, "-> hideMsg()");
var oMsgBox = $("ttq_message");
document.body.removeChild(oMsgBox);
_log(3, "<- hideMsg()");
}
function readCookie(name) {
_log(3, "-> readCookie()");
if(!name) {var name = "TTQ_TASKS";}
//1////////////////////////////////////////////
/*
var reg = new RegExp(name + "=([^;\n\r]*);?", "i");
var data = reg.exec(document.cookie);
if (data == null || data.length <= 1) {
return '';
}
return data[1];
*/
//2////////////////////////////////////////////
return GM_getValue(name+"_"+sServer+sLang,"");
//3////////////////////////////////////////////
_log(3, "<- readCookie()");
}
function createCookie(name,value) {
_log(2, "-> createCookie(): "+name+"="+value);
//4////////////////////////////////////////////
/*
var date = new Date();
date.setTime(date.getTime()+(365*24*60*60*1000));
var expires = "; expires="+date.toGMTString();
document.cookie = name+"="+value+expires+"; path=/";
*/
//5////////////////////////////////////////////
GM_setValue(name+"_"+sServer+sLang,value);
//6////////////////////////////////////////////
_log(3, "<- createCookie()");
return true;
}
function detectLanguage() {
if(sLang != "") {return;}
/*
var re = null; re = new RegExp("^http://[^/]*\.([a-zA-Z]{2,3})\/.*$", "i");
var lang = window.location.href.match(re);
if(!lang) {
return;
} else {
sLang = lang.pop();
}
*/
var host = window.location.hostname;
var hosts = host.split(".");
sLang = hosts[hosts.length-1];
if (host.indexOf("china.com")>0){
sLang = "cn";
}
sServer = hosts[0];
if (sServer.indexOf("rs")==0){
sLang = "rs";
}
}
if(!bDisplayVillageNames) {
return iPlaceId;
}
return iPlaceId;
_log(3, "<- getPlaceName()");
}
if(sResponse) {
if(aPlaces.length > 1) {
var iIndexId = aPlaces.indexOf(iPlaceId);
if(iIndexId > -1) { //this place is stored - remove
aPlaces.splice(iIndexId, 2);
}
}
aPlaces.push(iPlaceId);
aPlaces.push(encodeURI(sPlaceName));
var sNewCookie = aPlaces.join(",");
createCookie("TTQ_PLACE_NAMES", sNewCookie); //this cookie is valid 1 day
function makeClickable(object){
object.onmousedown = function(){
dragObject = this;
}
}
function getPosition(e){
var left = 0;
var top = 0;
while (e.offsetParent){
left += e.offsetLeft +
(e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
top += e.offsetTop +
(e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);
e = e.offsetParent;
}
left += e.offsetLeft +
(e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
top += e.offsetTop +
(e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);
return {x:left, y:top};
}
function mouseMove(ev){
var target = ev.target;
var mousePos = mouseCoords(ev);
if(dragObject){
dragObject.style.position = 'absolute';
dragObject.style.top = (mousePos.y - mouseOffset.y) +"px";
dragObject.style.left = (mousePos.x - mouseOffset.x) +"px";
}
lMouseState = iMouseDown;
return false;
}
function mouseUp(ev){
if(dragObject) {
switch(dragObject.id) {
case "ttq_message":
var key = "MSG_POSITION";
break;
case "timerform_wrapper":
var key = "FORM_POSITION";
break;
case "ttq_history":
var key = "HISTORY_POSITION";
break;
case "ttq_tasklist":
default:
var key = "LIST_POSITION";
break;
}
setOption(key, dragObject.style.top +"_"+ dragObject.style.left);
}
dragObject = null;
iMouseDown = false;
}
function mouseDown(ev){
var mousePos = mouseCoords(ev);
var target = ev.target;
iMouseDown = true;
if(target.getAttribute('DragObj')){
return false;
}
}
function makeDraggable(item){
if(!item) return;
item.addEventListener("mousedown",function(ev){
dragObject = this.parentNode;
mouseOffset = getMouseOffset(this.parentNode, ev);
return false;
}, false);
}
/*********************************************************************************
***/
function getRace() {
_log(3, "-> getRace()");
var xpathResult = xpath("//img[@class='unit']");
if (xpathResult.snapshotLength > 0) {
var src = xpathResult.snapshotItem(0).src;
var iTroopType = src.match(/([0-9]{1,2})\.gif/i);
if(!iTroopType || !iTroopType[1]) {
_log(2, "Image not found. Could not determine the race.");
return false;
}
iTroopType = parseInt(iTroopType[1]);
if(iTroopType > 20) {
return 2; //gaul
} else if(iTroopType > 10) {
return 1; //teutons
} else {
return 0; //Romans
}
} else {
_log(2, "Image not found. Could not determine the race.");
return false;
}
_log(3, "<- getRace()");
}
function getBuildingId() {
var re = /.*build\.php\?([a-z=0-9&]*&)?id=([0-9]{1,2})/i;
var iSiteId = window.location.href.match(re);
if(iSiteId != null) {
return parseInt(iSiteId[2]);
} else {
_log(2, "Building site ID not found");
return false;
}
}
return aMatch[1];
}
} else {
_log(2, "Active village could not be found.");
return false;
}
_log(3, "<- getActiveVillage()");
}
function trim(stringToTrim) {
return stringToTrim.replace(/^\s+|\s+$/g,"");
}
function ltrim(stringToTrim) {
return stringToTrim.replace(/^\s+/,"");
}
function rtrim(stringToTrim) {
return stringToTrim.replace(/\s+$/,"");
}
/**
* This function is called once, after user installed a new version of this script
*/
function performUpgrade() {
_log(3, "-> performUpgrade()");
createCookie("TTQ_CODE_0", "");
createCookie("TTQ_CODE_1", "");
createCookie("TTQ_PLACE_NAMES", "");
createCookie("TTQ_LIST_POSITION", "");
createCookie("TTQ_LAST_REFRESH", "");
createCookie("TTQ_VERSION", sCurrentVersion);
alert("Your Travian Smart Queue script has been updated.");
_log(3, "<- performUpgrade()");
}
/**
* @return The server timezone offset from GMT or false if it is not available.
*/
function getServerTimeOffset() {
_log(3, "-> getServerTimeOffset()");
var iServerTimeOffset = getOption("SERVER_TIME_OFFSET", false);
if(iServerTimeOffset != false) { //no automatic detection
_log(3, "Returning the predefined iServerTimeZoneOffset.");
return parseInt(iServerTimeOffset);
} else { //automatic detection
var iOffset = xpath("id('ltime')/span[2]");
if(iOffset.snapshotLength < 1) { //not found. Unknown offset.
return false;
} else {
iOffset = iOffset.snapshotItem(0).innerHTML;
var aMatch = iOffset.match( /([A-Z]{3})([-+]{1}[0-9]{1,2})/i );
if(!aMatch) {
_log(3, "No server time zone recognized, although it
seems to be displayed.");
return false;
}
iOffset = parseInt(aMatch[2]);
switch(aMatch[1]) {
case "AST":
return (iOffset - 4);
break;
case "EST":
return (iOffset - 5);
break;
case "CST":
return (iOffset - 6);
break;
case "MEZ":
return (iOffset + 1);
break;
case "UTC":
case "GMT":
default:
return iOffset;
break;
}
}
}
return false;
_log(3, "<- getServerTimeOffset()");
}
/**
* @return Current server time as formatted string or timestamp or false if the
server time cannot be determined.
*/
function getServerTime(bReturnTimestamp) {
_log(3, "-> getServerTime()");
// for now, we assume that the local UTC time = server UTC time.
//TODO: solve the situation when it's not
var oLocalTime = new Date();
var yy = oLocalTime.getUTCFullYear();
var mm = oLocalTime.getUTCMonth();
var dd = oLocalTime.getUTCDate();
var hh = oLocalTime.getUTCHours();
//now we can construct the Date object for the server time and return
formatted string
//var sTime = yy+"/"+mm+"/"+dd+" "+hh+":"+min+":"+sec;
var oServerDate = new Date(yy, mm, dd, UTCHoursServer, aMatch[2],
aMatch[3]);
//the created object has wrong timestamp - it was offset by local timezone
offset. Bring it back
var newtimestamp = oServerDate.getTime() - (oLocalTime.getTimezoneOffset() *
60000); //this is server time as UTC
/**
* @param {int}
* @return {str} Formatted date.
*/
function formatDate(yyyy, mm, dd, hh, min, sec) {
if(dd < 10) {dd = "0" + dd;}
if(mm < 10) {mm = "0" + mm;}
if(min < 10) {min = "0" + min;}
if(sec < 10) {sec = "0" + sec;}
return yyyy+"/"+mm+"/"+dd+" "+hh+":"+min+":"+sec;
}
function isInt(x) {
var y = parseInt(x);
if (isNaN(y)) {return false;}
return x==y && x.toString()==y.toString();
}
function getTroopsInfo(aTroops) {
var sTroopsInfo = "";
for(var i = 1; i < 12; i++) {
if(aTroops[i] > 0) {
sTroopsInfo += aLangTroops[iMyRace][i-1] + ": " +aTroops[i]+ ",
";
}
}
//trim last two characters
sTroopsInfo = sTroopsInfo.substring(0, sTroopsInfo.length - 2);
return sTroopsInfo;
}
function $(id) {
return document.getElementById(id);
}
function promptRace() {
var iMyRace = getOption("RACE", false, "integer");
var newRace = false;
while(!isInt(newRace)) {
var newRace = prompt("Travian Smart Queue: \nWhat is your race on this
server?\n(Type 0 for Romans, 1 for Teutons, 2 for Gauls.) \nCurrently: "
+iMyRace);
if(isInt(newRace)) {
newRace = parseInt(newRace);
if(newRace > -1 && newRace < 3) {
setOption("RACE", newRace);
location.replace(location.href);
break;
} else {
newRace = false;
}
}
}
}
function promptHistory() {
var newHistoryLength = false;
while(!isInt(newHistoryLength)) {
var newHistoryLength = prompt("Travian Smart Queue: \nHow many past
tasks do we keep in history?\n(Type 0 to disable task history.) \nCurrently: "
+iHistoryLength);
if(isInt(newHistoryLength)) {
newHistoryLength = parseInt(newHistoryLength);
if(newHistoryLength > -1) {
setOption("HISTORY_LENGTH", newHistoryLength);
location.replace(location.href);
break;
} else {
newHistoryLength = false;
}
}
}
}
ctxdoc.evaluate("//form[@name='snd']//td[@width='55%']/table/tbody/tr/td",
ctxdiv, null, XPathResult.FIRST_ORDERED_NODE_TYPE,
null).singleNodeValue.textContent.search(/(\d+)\/(\d+)/);
var nowmans = RegExp.$1;
if (parseInt(tOptions[4])-nowmans>0){
error = 2;
}else{
var id = "37";
var input = ctxdoc.getElementsByTagName("input");
for (var m=0;m<input.length;m++){
if (input[m].getAttribute("name")=="id"){
id = input[m].getAttribute("value");
}
}
var res1 = [];
var res1cap = [];
var tdbox = ctxdoc.getElementById("l4");
tdbox.textContent.search(/(\d+)\/(\d+)/);
res1[0] = RegExp.$1;
res1cap[0] = RegExp.$2;
tdbox = ctxdoc.getElementById("l3");
tdbox.textContent.search(/(\d+)\//);
res1[1] = RegExp.$1;
tdbox = ctxdoc.getElementById("l2");
tdbox.textContent.search(/(\d+)\//);
res1[2] = RegExp.$1;
tdbox = ctxdoc.getElementById("l1");
tdbox.textContent.search(/(\d+)\/(\d+)/);
res1[3] = RegExp.$1;
res1cap[1] = RegExp.$2;
var r = calcgoods(res1,res1cap,tOptions);
if (r[0]+r[1]+r[2]+r[3]>0){
if (r[0]==0){r[0]="";}
if (r[1]==0){r[1]="";}
if (r[2]==0){r[2]="";}
if (r[3]==0){r[3]="";}
var param =
"&id="+id+"&r1="+r[0]+"&r2="+r[1]+"&r3="+r[2]+"&r4="+r[3]+"&dname=&x="+tOptions[0]
+"&y="+tOptions[1];
dopost("build.php",param,handleTranstep3,opt);
}else{
error = 3;
}
}
}
}catch(e){
error = 5;
}
} else { // failed
error = 4;
}
if (error>0){
_log(1,(new
Date()).toLocaleString()+"AutoTranstep2Error,CODE="+error);
switch(error){
case 1:
printMsg( aLangTasks[aTask[0]] + t(" was attempted with
unknown result."), true );
break;
case 2:
_log(1,aLangTasks[aTask[0]] + tt("has not enough
businessmen."));
printMsg( aLangTasks[aTask[0]] + tt("has not enough
businessmen."), true );
break;
case 3:
_log(1,aLangTasks[aTask[0]] + "Resource Calcute ERROR.");
printMsg( aLangTasks[aTask[0]] + tt("transport error."),
true );
break;
case 4:
_log(1, "HTTP request status, return error.");
printMsg( aLangTasks[aTask[0]] + tt("transport error."),
true );
break;
case 5:
_log(1,aLangTasks[aTask[0]] + "Exception happened.");
printMsg( aLangTasks[aTask[0]] + tt("transport error."),
true );
break;
}
addToHistory(aTask, false);
switchActiveVillage(parseInt(opt[1]));
}
}
_log(3, "<- handleTranstep2()");
}
function handleTranstep3(httpRequest, opt) {
_log(3, "-> handleTranstep3()");
if (httpRequest.readyState == 4) {
var aTask = opt[0];
var error = 0;
var tOptions = aTask[3].split("_");
if (httpRequest.status == 200) { // ok
var id = "";
var a = "";
var sz = "";
var kid = "";
var aR = [];
try{
var sResponse = httpRequest.responseText;
if (!sResponse){
error = 1;
}else{
var ctxdiv = document.createElement("div");
ctxdiv.innerHTML = sResponse;
var ctxdoc = document.implementation.createDocument("", "",
null);
ctxdoc.appendChild(ctxdiv);
var input = ctxdoc.getElementsByTagName("input");
for (var m=0;m<input.length;m++){
if (input[m].getAttribute("name")=="id"){
id = input[m].getAttribute("value");
}else if (input[m].getAttribute("name")=="a"){
a = input[m].getAttribute("value");
}else if (input[m].getAttribute("name")=="sz"){
sz = input[m].getAttribute("value");
}else if (input[m].getAttribute("name")=="kid"){
kid = input[m].getAttribute("value");
}else if (input[m].getAttribute("name")=="r1"){
aR[0] = input[m].getAttribute("value");
}else if (input[m].getAttribute("name")=="r2"){
aR[1] = input[m].getAttribute("value");
}else if (input[m].getAttribute("name")=="r3"){
aR[2] = input[m].getAttribute("value");
}else if (input[m].getAttribute("name")=="r4"){
aR[3] = input[m].getAttribute("value");
}
}
var param =
"id="+id+"&a="+a+"&sz="+sz+"&kid="+kid+"&r1="+aR[0]+"&r2="+aR[1]+"&r3="+aR[2]+"&r4
="+aR[3];
if (a.length>0 && sz.length>0 && kid.length>0){
dopost("build.php",param,handleTranstep4,opt);
}else{
_log(1,(new
Date()).toLocaleString()+"AutoTransportERROR,param:"+param);
error = 2;
}
}
}catch(e){
error = 5;
}
} else { // failed
error = 4;
}
if (error>0){
_log(1,(new
Date()).toLocaleString()+"AutoTranstep3Error,CODE="+error);
switch(error){
case 1:
printMsg( aLangTasks[aTask[0]] + t(" was attempted with
unknown result."), true );
break;
case 2:
_log(1,aLangTasks[aTask[0]] + "Page content ERROR.");
printMsg( aLangTasks[aTask[0]] + tt("transport error."),
true );
break;
case 3:
break;
case 4:
_log(1, "HTTP request status, return error.");
printMsg( aLangTasks[aTask[0]] + tt("transport error."),
true );
break;
case 5:
_log(1,aLangTasks[aTask[0]] + "Exception happened.");
printMsg( aLangTasks[aTask[0]] + tt("transport error."),
true );
break;
}
addToHistory(aTask, false);
switchActiveVillage(parseInt(opt[1]));
}
}
_log(3, "<- handleTranstep3()");
}
function handleTranstep4(httpRequest, opt) {
_log(3, "-> handleTranstep4()");
if (httpRequest.readyState == 4) {
var aTask = opt[0];
var error = 0;
var aTrans = aTask[3].split("_");
if (httpRequest.status == 200) { // ok
try{
var sResponse = httpRequest.responseText;
if (!sResponse){
error = 1;
}else{
printMsg('<span class="ttq_village_name"
style="display:block;">' +getVillageName(aTask[4])+ '</span>' + tt("To") +
"("+aTrans[0]+"|"+aTrans[1]+") "+tt("AutoTransport")+" "+tt("hasbeenstarted"));
addToHistory(aTask, true);
}
}catch(e){
error = 5;
}
} else { // failed
error = 4;
}
if (error>0){
_log(1,(new
Date()).toLocaleString()+"AutoTranstep4Error,CODE="+error);
switch(error){
case 1:
printMsg( aLangTasks[aTask[0]] + t(" was attempted with
unknown result."), true );
break;
case 2:
break;
case 3:
break;
case 4:
_log(1, "HTTP request status, return error.");
printMsg( aLangTasks[aTask[0]] + tt("transport error."),
true );
break;
case 5:
_log(1,aLangTasks[aTask[0]] + "Exception happened.");
printMsg( aLangTasks[aTask[0]] + tt("transport error."),
true );
break;
}
addToHistory(aTask, false);
}
switchActiveVillage(parseInt(opt[1]));
}
_log(3, "-> handleTranstep4()");
}
function createTradeLink() {
_log(3, "-> createTradeLink()");
var oOkBtn = document.getElementById('submitText');
if (oOkBtn){
var oBtn = document.createElement("a");
oBtn.setAttribute("href","#");
oBtn.innerHTML = tt("AutoTrade");
oBtn.style.margin = "6px 30px";
oBtn.addEventListener("click", scheduleTrade, false);
oOkBtn.appendChild(oBtn);
}
_log(3, "<- createResearchLinks()");
}
function scheduleTrade(e) {
_log(3, "-> scheduleTrade()");
var iVillageId = getActiveVillage();
var aParams = [0,0,0,0];
displayTimerForm(6, iVillageId, aParams);
_log(3, "<- scheduleTrade()");
}
function trade(aTask) {//you must be sure there has no more transport before
autotrade time comes!!!!
_log(3, "-> trade()");
var sNewDid = "newdid=" +aTask[4];
var currentActiveVillage = getActiveVillage();
_log(2, "Switching to village:" +aTask[4]);
doget("build.php?"+sNewDid+"&gid=17&t=3",handleTradestep3,
[aTask,currentActiveVillage]);
_log(3, "<- trade()");
}
function handleTradestep3(httpRequest, opt) {
_log(3, "-> handleTradestep3()");
if (httpRequest.readyState == 4) {
_log(3, "-> handleTradestep3() --> httpRequest.readyState==4");
if (httpRequest.status == 200) { // ok
var aTask = opt[0];
try{
var tOptions = aTask[3].split("_");
tOptions[0] = parseInt(tOptions[0]);
tOptions[1] = parseInt(tOptions[1]);
tOptions[2] = parseInt(tOptions[2]);
tOptions[3] = parseInt(tOptions[3]);
var ctxdiv = document.createElement("div");
ctxdiv.innerHTML = httpRequest.responseText;
var ctxdoc = document.implementation.createDocument("", "",
null);
ctxdoc.appendChild(ctxdiv);
var id,t,a;
var resm1 = [0,0,0,0];
var resm2 = [0,0,0,0];
var res1cap = [0,0];
var res1grow = [0,0,0,0];
var tdbox = ctxdoc.getElementById("l4");
tdbox.textContent.search(/(\d+)\/(\d+)/);
res1cap[0] = RegExp.$2;
res1grow[0] = tdbox.getAttribute("title");
tdbox = ctxdoc.getElementById("l3");
tdbox.textContent.search(/(\d+)\//);
res1grow[1] = tdbox.getAttribute("title");
tdbox = ctxdoc.getElementById("l2");
tdbox.textContent.search(/(\d+)\//);
res1grow[2] = tdbox.getAttribute("title");
tdbox = ctxdoc.getElementById("l1");
tdbox.textContent.search(/(\d+)\/(\d+)/);
res1cap[1] = RegExp.$2;
res1grow[3] = tdbox.getAttribute("title");
var input = ctxdoc.getElementsByTagName("input");
var mseq = 0;
for (var m=0;m<input.length;m++){
if (input[m].getAttribute("name")=="id"){
id = input[m].getAttribute("value");
}else if (input[m].getAttribute("name")=="t"){
t = input[m].getAttribute("value");
}else if (input[m].getAttribute("name")=="a"){
a = input[m].getAttribute("value");
}else if (input[m].getAttribute("name")=="m1[]"){
resm1[mseq++] =
parseInt(input[m].getAttribute("value"));
}
}
res1cap[0] = parseInt(res1cap[0]);
res1cap[1] = parseInt(res1cap[1]);
res1grow[0] = parseInt(res1grow[0]);
res1grow[1] = parseInt(res1grow[1]);
res1grow[2] = parseInt(res1grow[2]);
res1grow[3] = parseInt(res1grow[3]);
if (resm1[3]<(res1cap[1]-res1grow[3]/30) &&
tOptions[4]=="false"){//append task again for next check some seconds later
var minutes = Math.floor((res1cap[1]-res1grow[3]/30-
resm1[3])/res1grow[3]*60);
_log(1,(new Date()).toLocaleString()+":AutoTrade is not
needed, resm1[3]="+resm1[3]+",,res1cap[1]="+res1cap[1]+",,delay:"+minutes);
printMsg('<span class="ttq_village_name"
style="display:block;">' +getVillageName(aTask[4])+ '</span>' + tt("Schedule later
after") + minutes + tt("minutes") + tt("resource") + resm1[3], true);
addToHistory(aTask, false);
aTask[1] = Math.floor(parseInt(aTask[1])+((res1cap[1]-
res1grow[3]/30-resm1[3])/res1grow[3]*60*60));
appendTask(aTask);
switchActiveVillage(parseInt(opt[1]));
}else{
var tot = resm1[0]+resm1[1]+resm1[2]+resm1[3];
var avg = 0;
if
((tOptions[0]+tOptions[1]+tOptions[2]+tOptions[3])>1000){
resm2[0] = tOptions[0];
resm2[1] = tOptions[1];
resm2[2] = tOptions[2];
resm2[3] = tOptions[3];
avg = Math.floor((tot-tOptions[0]-tOptions[1]-
tOptions[2]-tOptions[3])/3);
resm2[0] = resm2[0]+avg;
resm2[1] = resm2[1]+avg;
resm2[2] = resm2[2]+avg-200;
resm2[3] = tot-resm2[0]-resm2[1]-resm2[2];
if (resm2[0]>res1cap[0]){
resm2[3] = resm2[3]+ resm2[0]-
res1cap[0]+res1grow[0]*2;
resm2[0] = res1cap[0]-res1grow[0]*2;
}
if (resm2[1]>res1cap[0]){
resm2[3] = resm2[3]+ resm2[1]-
res1cap[0]+res1grow[1]*2;
resm2[1] = res1cap[0]-res1grow[1]*2;
}
if (resm2[2]>res1cap[0]){
resm2[3] = resm2[3]+ resm2[2]-
res1cap[0]+res1grow[2]*2;
resm2[2] = res1cap[0]-res1grow[2]*2;
}
}else{
avg = Math.floor(tot/3);
if (avg>(res1cap[0]-res1grow[0])){
resm2[0] = res1cap[0]-res1grow[0]*2;
resm2[1] = res1cap[0]-res1grow[1]*2;
resm2[2] = res1cap[0]-res1grow[2]*2;
resm2[3] = tot-resm2[0]-resm2[1]-resm2[2];
}else{
resm2[0] = avg;
resm2[1] = avg;
resm2[2] = tot - avg*2 - 200;
resm2[3] = 200;//Too small value in Some Server
is not allowed. for example in travian.cn the corn is must bigger than 50
}
}
var param =
"gid=17&id="+id+"&t="+t+"&a="+a+"&m2[]="+resm2[0]+"&m1[]="+resm1[0]+"&m2[]="+resm2
[1]+"&m1[]="+resm1[1]+"&m2[]="+resm2[2]+"&m1[]="+resm1[2]+"&m2[]="+resm2[3]+"&m1[]
="+resm1[3];
_log(1,(new
Date()).toLocaleString()+",AutoTradeParam:"+param);
dopost("build.php",param,handleTrade4,opt);
}
}catch(e){
_log(1,(new
Date()).toLocaleString()+"AutoTrade.error.name="+e.name+",errmsg="+e.message);
}
} else { // failed
_log(2, "HTTP request status: " + httpRequest.status);
}
}
_log(3, "<- handleTradestep3()");
}
function handleTrade4(httpRequest, opt) {
_log(3, "-> handleTradestep4()");
if (httpRequest.readyState == 4) {
if (httpRequest.status == 200) { // ok
var aTask = opt[0];
var sResponse = httpRequest.responseText;
var re = new RegExp('<form method="post" name="snd"','i');
if(sResponse.match(re)) {//error
_log(1,sResponse);
printMsg('<span class="ttq_village_name"
style="display:block;">' +getVillageName(aTask[4])+ '</span>' + tt("AutoTrade")+"
"+tt("Autotrade failed."),true);
addToHistory(aTask, false);
//appendTask(aTask);
}else{
printMsg('<span class="ttq_village_name"
style="display:block;">' +getVillageName(aTask[4])+ '</span>' + tt("AutoTrade")+"
"+tt("Autotrade has done."));
addToHistory(aTask, true);
}
} else { // failed
_log(2, "HTTP request status: " + httpRequest.status);
}
switchActiveVillage(parseInt(opt[1]));
}
_log(3, "<- handleTradestep4()");
}
function appendTask(aTask){
var nseconds = getRandom(iDelayMIN,iDelayMAX);
aTask[1] = parseInt(aTask[1])+nseconds;
bLocked = true;
var data = readCookie("TTQ_TASKS");
var oldValue = (data == null || data.length <= 1 || data == '') ? '' : data
+ '|';
var newValue = oldValue + aTask[0] + ',' + aTask[1] + ',' + aTask[2] + ',' +
aTask[3] + ',' + aTask[4];
createCookie("TTQ_TASKS", newValue);
bLocked = false;
var aTasks = newValue.split("|");
refreshTaskList(aTasks);
}
///////////////////////////resource auto transportor/////////////////end
function onLoad() {
_log(3, "-> onLoad()");
_log(3, "oIntervalReference " + oIntervalReference);
if(readCookie("TTQ_VERSION", 0) != sCurrentVersion) {
performUpgrade();
}
if(!oIntervalReference) {
_log(3, "setInterval()");
oIntervalReference = window.setInterval(checkSetTasks, iCheckEvery);
}
var re = /.*build\.php.*/i;
if (re.test(window.location.href)) {
createBuildLinks();
createResearchLinks();
createTrainLinks();
}
//var re = /.*a2b\.php\?(newdid=[0-9]*&)?z=.*/i;
var re = /.*a2b\.php/i
if (re.test(window.location.href)) {
createAttackLinks();
}
data = readCookie("TTQ_HISTORY");
if(iHistoryLength > 0 && data != '') {
var aTasks = trimHistory(data, iHistoryLength).split("|");
refreshHistory(aTasks);
}