Mousehunt AutoHorn

Longtail AutoHorn

当前为 2014-07-02 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Mousehunt AutoHorn
  3. // @namespace http://userscripts.org/scripts/show/74721
  4. // @description Longtail AutoHorn
  5. // @version 4.2.1
  6. // @include http://*.mousehuntgame.com/*
  7. // @include https://*.mousehuntgame.com/*
  8. // @exclude http://*.mousehuntgame.com/images/*
  9. // @exclude https://*.mousehuntgame.com/images/*
  10. // @grant GM_getValue
  11. // @grant GM_setValue
  12. // @require http://code.jquery.com/jquery.min.js
  13. // @author are
  14. // ==/UserScript==
  15.  
  16. /* Global Variables */
  17. var defaultpage = 'http://www.mousehuntgame.com';
  18. var hornpage = 'http://www.mousehuntgame.com/turn.php';
  19. var origtitle = document.title;
  20. var timerEvent;
  21. var timerTitle;
  22. var timerTrapCheck;
  23. var waktuTrapCheck;
  24. var waktuNextHorn;
  25. var waktuRandom;
  26. var waktuTitle;
  27. var waktuTournament;
  28. var msgTitle = 'Sound The Horn';
  29. var alertShown = false;
  30. var hornAllowed = false;
  31. var currentTrap = {weapon:0, base:0, trinket:0, bait:0, cached:false, busy:false, effmeter:null};
  32. var trapConfig = {TrapCheck:{enable:false,min:0,sec:5},SeasonalGarden:{autoTravel:false,'wr':{weapon:-1,base:-1,trinket:-1,bait:-1},'sg':{weapon:-1,base:-1,trinket:-1,bait:-1},'sr':{weapon:-1,base:-1,trinket:-1,bait:-1},'fl':{weapon:-1,base:-1,trinket:-1,bait:-1}},ZugzwangTower:{enabled:0,target:0,pawn:{weapon:-1,base:-1,trinket:-1,bait:-1},knight:{weapon:-1,base:-1,trinket:-1,bait:-1},bishop:{weapon:-1,base:-1,trinket:-1,bait:-1},rook:{weapon:-1,base:-1,trinket:-1,bait:-1},queen:{weapon:-1,base:-1,trinket:-1,bait:-1},king:{weapon:-1,base:-1,trinket:-1,bait:-1},chessmaster:{weapon:-1,base:-1,trinket:-1,bait:-1},minAmplifier:0},Iceberg:{enabled:0,altGeneralEnable:0,slushy_shoreline:{weapon:-1,base:-1,trinket:-1,bait:-1},phase1:{weapon:-1,base:-1,trinket:-1,bait:-1},phase2:{weapon:-1,base:-1,trinket:-1,bait:-1},phase3:{weapon:-1,base:-1,trinket:-1,bait:-1},phase4:{weapon:-1,base:-1,trinket:-1,bait:-1},phase5:{weapon:-1,base:-1,trinket:-1,bait:-1},generals:{weapon:-1,base:-1,trinket:-1,bait:-1},altgenerals:{weapon:-1,base:-1,trinket:-1,bait:-1}},BalackCove:{enabled:0,travel:0,jod:{weapon:-1,base:-1,trinket:-1,bait:98},low:{weapon:38,base:-1,trinket:-1,bait:119},mid:{weapon:38,base:-1,trinket:-1,bait:119},high:{weapon:38,base:-1,trinket:-1,bait:118}},FieryWarpath:{enabled:0,general:{weapon:-1,base:-1,trinket:-1,bait:-1},physical:{weapon:-1,base:-1,trinket:-1,bait:-1},tactical:{weapon:-1,base:-1,trinket:-1,bait:-1},hydro:{weapon:-1,base:-1,trinket:-1,bait:-1},arcane:{weapon:-1,base:-1,trinket:-1,bait:-1},gargantua:{weapon:-1,base:-1,trinket:-1,bait:-1},warden:{weapon:-1,base:-1,trinket:-1,bait:-1},warmonger:{weapon:-1,base:-1,trinket:-1,bait:-1},wave1:{superBrie:0,maxStreak:9,superCharm:0,gargantua:true,minGeneral:99,targetPhysical:true,charmNonPhysical:false,openSelection:true},wave2:{superBrie:0,maxStreak:9,superCharm:0,gargantua:true,minGeneral:99,targetPhysical:true,charmNonPhysical:true,targetNonPhysical:false,allowNonPhysical:false},wave3:{superBrie:0,maxStreak:9,superCharm:0,gargantua:true,minGeneral:99,targetPhysical:true,charmNonPhysical:true,targetNonPhysical:false,allowNonPhysical:false}}};
  33. var availableTraps = {};
  34. var AUDIO = {
  35. reward: 'data:audio/mid;base64,TVRoZAAAAAYAAQAQAeBNVHJrAAAAMAD/WAQBAhgIAP9ZAgAAAP9ZAgAAAP9UBSAAAAAAAP9RAwOpgINg/1EDBYx0AP8vAE1UcmsAAAAyAP8DCygxKSBPY2FyaW5hAP8ECkF1dG9t YXRpb24A/wENKEMpMjAwMSBOb2tpYQD/LwBNVHJrAAAAfgD/IAEBAP8DCygxKSBPY2FyaW5hAP8ECCpOZXcgICAgALF5AHjBSQWxB38ACkABC38EW38AXQBkZQAFZAAFBgcFZX8F ZH+BZpFaWQDhAECBQzVFD2FJDyJQDw5mgXB0f4FwAECBQzVFD2FJD01UDy9mgXB/f4NggVoAAP8vAE1UcmsAAACBAP8gAQIA/wMMKDEpIE9jYXJpbmEyAP8ECCpOZXcgICAgALJ5 AIFwwkkFsgt/AApAAQdaBF0AAFsogRFlAAVkAAUGBwVlfwVkf4Ixklo+AOIAQIFDNUUPYUkPIlAPDmaBcHR/gXAAQIFDNUUPYUkPTVQPL2aBcH9/g2CCWgAA/y8ATVRyawAAAH8A /yABAwD/AwwoMSkgT2NhcmluYTMA/wQIKk5ldyAgICAAs3kAeMNJBbMLfwAKQAEHQARdAABbKHhlAAVkAAUGBwVlfwVkf4Uyk1ouAOMAQIFDNUUPYUkPIlAPDmaBcHR/gXAAQIFD NUUPYUkPTVQPL2aBcH9/g2CDWgAA/y8ATVRyawAAAH8A/yABBAD/AwwoMSkgT2NhcmluYTQA/wQIKk5ldyAgICAAtHkAeMRJBbQLfwAKQAEHMgRdAABbKF9lAAVkAAUGBwVlfwVk f4c7lFogAOQAQIFDNUUPYUkPIlAPDmaBcHR/gXAAQIFDNUUPYUkPTVQPL2aBcH9/g2CEWgAA/y8ATVRyawAAAH8A/yABBQD/AwwoMSkgT2NhcmluYTkA/wQIKk5ldyAgICAAtXkA eMVJBbULfwAKQAEHKARdAABbKF9lAAVkAAUGBwVlfwVkf5BrlVoqAOUAQIFDNUUPYUkPIlAPDmaBcHR/gXAAQIFDNUUPYUkPTVQPL2aBcH9/g2CFWgAA/y8ATVRyawAAAIAA/yAB BgD/Aw0oMSkgT2NhcmluYTEwAP8ECCpOZXcgICAgALZ5AHjGSQW2C38ACkABBx4EXQAAWyhfZQAFZAAFBgcFZX8FZH+SW5ZaFgDmAECBQzVFD2FJDyJQDw5mgXB0f4FwAECBQzVF D2FJD01UDy9mgXB/f4NghloAAP8vAE1UcmsAAACAAP8gAQcA/wMNKDEpIE9jYXJpbmExMQD/BAgqTmV3ICAgIAC3eQB4x0kFtwt/AApAAQcUBF0AAFsoX2UABWQABQYHBWV/BWR/ lEuXWgIA5wBAgUM1RQ9hSQ8iUA8OZoFwdH+BcABAgUM1RQ9hSQ9NVA8vZoFwf3+DYIdaAAD/LwBNVHJrAAAAgAD/IAEIAP8DDSgxKSBPY2FyaW5hMTIA/wQIKk5ldyAgICAAuHkA eMhJBbgLfwAKQAEHFARdAABbKF9lAAVkAAUGBwVlfwVkf5Y7mFoBAOgAQIFDNUUPYUkPIlAPDmaBcHR/gXAAQIFDNUUPYUkPTVQPL2aBcH9/g2CIWgAA/y8ATVRyawAAAH4A/yAB CgD/AwsoMSkgT2NhcmluYQD/BAgqTmV3ICAgIAC6eQB4ylgFugd/AApAAQt/BFt/AF0AZGUABWQABQYHBWV/BWR/kGaaWlwA6gBAgUM1RQ9hSQ8iUA8OZoFwdH+BcABAgUM1RQ9h SQ9NVA8vZoFwf3+DYIpaAAD/LwBNVHJrAAAAgQD/IAELAP8DDCgxKSBPY2FyaW5hMgD/BAgqTmV3ICAgIAC7eQCBcMtYBbsLfwAKQAEHWgRdAABbKIERZQAFZAAFBgcFZX8FZH+R MZtaSADrAECBQzVFD2FJDyJQDw5mgXB0f4FwAECBQzVFD2FJD01UDy9mgXB/f4Ngi1oAAP8vAE1UcmsAAAB/AP8gAQwA/wMMKDEpIE9jYXJpbmEzAP8ECCpOZXcgICAgALx5AHjM WAW8C38ACkABB0AEXQAAWyh4ZQAFZAAFBgcFZX8FZH+UMpxaNADsAECBQzVFD2FJDyJQDw5mgXB0f4FwAECBQzVFD2FJD01UDy9mgXB/f4NgjFoAAP8vAE1UcmsAAAB/AP8gAQ0A /wMMKDEpIE9jYXJpbmE0AP8ECCpOZXcgICAgAL15AHjNWAW9C38ACkABBzIEXQAAWyhfZQAFZAAFBgcFZX8FZH+WO51aIADtAECBQzVFD2FJDyJQDw5mgXB0f4FwAECBQzVFD2FJ D01UDy9mgXB/f4NgjVoAAP8vAE1UcmsAAAB/AP8gAQ4A/wMMKDEpIE9jYXJpbmE5AP8ECCpOZXcgICAgAL55AHjOWAW+C38ACkABBygEXQAAWyhfZQAFZAAFBgcFZX8FZH+fa55a KgDuAECBQzVFD2FJDyJQDw5mgXB0f4FwAECBQzVFD2FJD01UDy9mgXB/f4NgjloAAP8vAE1UcmsAAACAAP8gAQ8A/wMNKDEpIE9jYXJpbmExMAD/BAgqTmV3ICAgIAC/eQB4z1gF vwt/AApAAQceBF0AAFsoX2UABWQABQYHBWV/BWR/oVufWhYA7wBAgUM1RQ9hSQ8iUA8OZoFwdH+BcABAgUM1RQ9hSQ9NVA8vZoFwf3+DYI9aAAD/LwA='
  36. }
  37.  
  38. /* Begin script function list */
  39. function tulisWaktu(){
  40. if (timerTitle) clearTimeout(timerTitle);
  41. var sekarang = new Date();
  42. if (loadParam('updateWindowTitle', true) && waktuTitle) {
  43. if ($('div#mobileHorn').length > 0) {
  44. if (sekarang >= waktuNextHorn)
  45. document.title = msgTitle + ' | ' + origtitle;
  46. else
  47. document.title = msgWaktu(sekarang, waktuNextHorn) + ' | ' + origtitle;
  48. } else {
  49. if (sekarang >= waktuTitle)
  50. document.title = msgTitle + ' | ' + origtitle;
  51. else
  52. document.title = msgWaktu(sekarang, waktuTitle) + ' | ' + origtitle;
  53. }
  54. }
  55. if (waktuNextHorn && sekarang <= waktuNextHorn) $('div#AutoHorn li span[name="hornTime"]').html(msgWaktu(sekarang, waktuNextHorn));
  56. else $('div#AutoHorn li span[name="hornTime"]').html("00:00");
  57. if (waktuRandom && sekarang <= waktuRandom)
  58. $('div#AutoHorn li span[name="randomTime"]').html(msgWaktu(sekarang, waktuRandom));
  59. if (waktuTournament && sekarang < waktuTournament && $('div#tournamentStatusHud div.timer').length > 0){
  60. var tmp = msgWaktu(sekarang, waktuTournament, 1);
  61. try {
  62. if (unsafeWindow.user.viewing_atts.tournament.status == 'pending')
  63. tmp = 'Starts in: ' + tmp;
  64. else if (unsafeWindow.user.viewing_atts.tournament.status == 'active')
  65. tmp = tmp + ' remaining';
  66. } catch (err) {
  67. }
  68. $('div#tournamentStatusHud div.timer').html(tmp);
  69. }
  70. if (waktuTrapCheck && sekarang <= waktuTrapCheck) $('div#AutoHorn li span[name="trapCheckTime"]').html(msgWaktu(sekarang, waktuTrapCheck));
  71. else $('div#AutoHorn li span[name="trapCheckTime"]').html("00:00");
  72. timerTitle = setTimeout(function() { tulisWaktu(); } , 1000);
  73. }
  74.  
  75. function openLink(link){
  76. if ($('a[href="' + link + '"]').length > 0) $('a[href="' + link + '"]').first().click();
  77. window.location.href = link;
  78. }
  79.  
  80. function msgWaktu(awal, akhir, panjang){
  81. panjang = typeof panjang != "undefined" ? panjang : false;
  82. var detik = Math.round((akhir - awal) / 1000);
  83. var jam = Math.floor(detik / 3600);
  84. var menit = Math.floor(detik / 60);
  85. if (jam == 0) jam = null;
  86. menit = menit % 60;
  87. if (menit < 10) menit = '0' + menit;
  88. detik = detik % 60;
  89. if (detik < 10) detik = '0' + detik;
  90. if (jam) return (panjang ? jam + ' hrs ' + menit + ' mins ' + detik + ' secs' : jam + ':' + menit + ':' + detik);
  91. else return (panjang ? menit + ' mins ' + detik + ' secs' : menit + ':' + detik);
  92. }
  93.  
  94. function soundAlarm(){
  95. var alarm = document.getElementById('alarm');
  96. if (!alarm) {
  97. alarm = document.createElement("span");
  98. alarm.id = 'alarm';
  99. $('body').append(alarm);
  100. }
  101. alarm.innerHTML = '<embed src="' + AUDIO.reward + '" height="50" width="200" hidden="true" autostart="true" loop="true" volume="' + loadParam('alertVolume', 100) + '"></embed>';
  102. }
  103.  
  104. function calculateRandomPage(){
  105. if (typeof unsafeWindow.user == 'undefined') { setTimeout(function() { calculateRandomPage(); }, 1000); return; }
  106. var mintime = loadParam('minRandomPage', 10) * 60000;
  107. var maxtime = loadParam('maxRandomPage', 20) * 60000;
  108. var timeoutvalue = Math.random() * (maxtime - mintime) + mintime;
  109. setTimeout(function() { randomLinks(); }, timeoutvalue);
  110. waktuRandom = new Date(new Date().getTime() + timeoutvalue);
  111. }
  112.  
  113. function calculateTrapCheck(){
  114. if (timerTrapCheck) clearTimeout(timerTrapCheck);
  115. var sekarang = new Date();
  116. var checkTime = new Date();
  117. checkTime.setMinutes(trapConfig.TrapCheck.min, trapConfig.TrapCheck.sec, 0);
  118. if (checkTime < sekarang) checkTime.setTime(checkTime.getTime() + 3600000);
  119. timerTrapCheck = setTimeout(function() {
  120. if (trapConfig.TrapCheck.enable) {
  121. if (currentTrap.bait > 0) randomLinks();
  122. else openLink('http://www.mousehuntgame.com/index.php');
  123. } else calculateTrapCheck();
  124. }, checkTime.getTime() - sekarang.getTime());
  125. waktuTrapCheck = checkTime;
  126. }
  127.  
  128. function randomLinks(){
  129. if ($('div#mobileHorn').length > 0) {
  130. openLink(defaultpage);
  131. return;
  132. }
  133. var daftar = new Array();
  134. daftar.push('http://www.mousehuntgame.com/journal.php');
  135. daftar.push('http://www.mousehuntgame.com/profile.php');
  136. $('a[href*="www.mousehuntgame.com/inventory.php"]').add('a[href*="www.mousehuntgame.com/shops.php"]').add('a[href*="www.mousehuntgame.com/adversaries.php?"]').add('a[href*="www.mousehuntgame.com/item.php"]').add('a[href*="www.mousehuntgame.com/journal.php"]').add('a[href*="www.mousehuntgame.com/profile.php"]').add('a[href*="www.mousehuntgame.com/hunterprofile.php"]').add('a[href*="www.mousehuntgame.com/tournament.php"]').add('a[href*="www.mousehuntgame.com/tournamentlist.php"]').not('a[href*="&"]').not('a[href*="#"]').each(function(i){
  137. var link = $(this).attr('href');
  138. var sudahada = false;
  139. for (var x = 0; x < daftar.length; x++) if (daftar[x] == link) { sudahada = true; break; }
  140. if (!sudahada) daftar.push(link);
  141. });
  142. if (daftar.length > 0){
  143. var x = Math.floor(Math.random() * daftar.length);
  144. openLink(daftar[x]);
  145. }
  146. }
  147.  
  148. function warpathGetTrinket(subgroup, useSuper){
  149. if (typeof subgroup == 'undefined') return 0;
  150. if (typeof useSuper == 'undefined') useSuper = false;
  151. if (subgroup == 'Warrior') {
  152. if (useSuper && getComponentQuantity(544) > 0) return 544;
  153. else if (getComponentQuantity(539) > 0) return 539;
  154. } else if (subgroup == 'Scout') {
  155. if (useSuper && getComponentQuantity(543) > 0) return 543;
  156. else if (getComponentQuantity(538) > 0) return 538;
  157. } else if (subgroup == 'Archer') {
  158. if (useSuper && getComponentQuantity(540) > 0) return 540;
  159. else if (getComponentQuantity(534) > 0) return 534;
  160. } else if (subgroup == 'Cavalry') {
  161. if (useSuper && getComponentQuantity(541) > 0) return 541;
  162. else if (getComponentQuantity(535) > 0) return 535;
  163. } else if (subgroup == 'Mage') {
  164. if (useSuper && getComponentQuantity(542) > 0) return 542;
  165. else if (getComponentQuantity(537) > 0) return 537;
  166. } else if (subgroup == 'Commander') {
  167. if (useSuper && getComponentQuantity(615) > 0) return 615;
  168. else if (getComponentQuantity(536) > 0) return 536;
  169. }
  170. return 0;
  171. }
  172.  
  173. function warpathGetNumRetreat(){
  174. var streak = parseInt(unsafeWindow.user.viewing_atts.desert_warpath.streak.quantity);
  175. if (streak < 1) streak = 1;
  176. var pop = unsafeWindow.user.viewing_atts.desert_warpath.wave_population;
  177. var hasil = 0;
  178. for (var nama in pop){
  179. hasil += (parseInt(pop[nama].population) > streak ? streak : parseInt(pop[nama].population));
  180. }
  181. return hasil;
  182. }
  183.  
  184. function warpathGetPhysical(isMax, isReverse, trywithtrinket){
  185. var pop = unsafeWindow.user.viewing_atts.desert_warpath.wave_population;
  186. var hasil;
  187. if (typeof trywithtrinket=='undefined') trywithtrinket = true;
  188. // try with trinket
  189. if (trywithtrinket) for (var nama in pop){
  190. if (parseInt(pop[nama].population) < 1 || warpathGetTrinket(pop[nama].subgroup, true) < 1) continue;
  191. if (!hasil || ((isReverse ^ (pop[nama].weakness.name == 'Physical')) && (!isMax ^ (parseInt(pop[nama].population) > parseInt(pop[hasil].population))))) hasil = nama;
  192. }
  193. // try without trinket
  194. if (!hasil) for (var nama in pop){
  195. if (parseInt(pop[nama].population) < 1) continue;
  196. if (!hasil || ((isReverse ^ (pop[nama].weakness.name == 'Physical')) && (!isMax ^ (parseInt(pop[nama].population) > parseInt(pop[hasil].population))) && pop[nama].subgroup != 'Artillery')) hasil = nama;
  197. }
  198. return hasil;
  199. }
  200.  
  201. function warpathGetGroupLeft(){
  202. var pop = unsafeWindow.user.viewing_atts.desert_warpath.wave_population;
  203. var hasil = 0;
  204. for (var nama in pop){
  205. if (parseInt(pop[nama].population) > 0) hasil++;
  206. }
  207. return hasil;
  208. }
  209.  
  210. function checkLocation(){
  211. if (unsafeWindow.user.environment_id == 31 && trapConfig.ZugzwangTower.enabled) { // seasonal_garden
  212. if (trapConfig.SeasonalGarden.autoTravel && unsafeWindow.user.viewing_atts.zzt_amplifier >= unsafeWindow.user.viewing_atts.zzt_max_amplifier)
  213. return travelTo('seasonal_garden', 'zugzwang_tower');
  214. else
  215. return changeTrap(trapConfig.SeasonalGarden[unsafeWindow.user.viewing_atts.season]);
  216. } else if (unsafeWindow.user.environment_id == 14 && trapConfig.BalackCove.enabled) { // jungle_of_dread
  217. if (trapConfig.BalackCove.travel && (getComponentQuantity(119) > 0 || getComponentQuantity(118) > 0)) return travelTo('jungle_of_dread', 'balacks_cove');
  218. else return changeTrap(trapConfig.BalackCove.jod);
  219. } else if (unsafeWindow.user.environment_id == 2 && trapConfig.BalackCove.enabled) { // balacks_cove
  220. var desired = {base:-1,weapon:-1,trinket:-1,bait:-1};
  221. if (unsafeWindow.user.viewing_atts.tide == 'high') desired = trapConfig.BalackCove.high;
  222. else if (unsafeWindow.user.viewing_atts.tide == 'low') desired = trapConfig.BalackCove.low;
  223. else desired = trapConfig.BalackCove.mid;
  224. if (desired.bait > 0 && getComponentQuantity(desired.bait) < 1){
  225. if (desired.bait == 119 && getComponentQuantity(118) > 0) desired.bait = 118;
  226. else if (desired.bait == 118 && getComponentQuantity(119) > 0) desired.bait = 119;
  227. else return travelTo('balacks_cove', 'jungle_of_dread');
  228. }
  229. return changeTrap(desired);
  230. } else if (unsafeWindow.user.environment_id == 32 && trapConfig.ZugzwangTower.enabled) { // zugzwang_tower
  231. var zzt_mage_progress = unsafeWindow.user.viewing_atts.zzt_mage_progress;
  232. var zzt_tech_progress = unsafeWindow.user.viewing_atts.zzt_tech_progress;
  233. var zzt_progress = Math.max(zzt_mage_progress, zzt_tech_progress);
  234. if (trapConfig.ZugzwangTower.target == 1) zzt_progress = zzt_tech_progress;
  235. else if (trapConfig.ZugzwangTower.target == 2) zzt_progress = zzt_mage_progress;
  236. else if (trapConfig.ZugzwangTower.target == 3 && zzt_progress >= 16) zzt_progress = Math.min(zzt_mage_progress, zzt_tech_progress);
  237. var desired;
  238. if (zzt_progress < 8) desired = jQuery.extend(true, {}, trapConfig.ZugzwangTower.pawn);
  239. else if (zzt_progress < 10) desired = jQuery.extend(true, {}, trapConfig.ZugzwangTower.knight);
  240. else if (zzt_progress < 12) desired = jQuery.extend(true, {}, trapConfig.ZugzwangTower.bishop);
  241. else if (zzt_progress < 14) desired = jQuery.extend(true, {}, trapConfig.ZugzwangTower.rook);
  242. else if (zzt_progress < 15) desired = jQuery.extend(true, {}, trapConfig.ZugzwangTower.queen);
  243. else if (zzt_progress < 16) desired = jQuery.extend(true, {}, trapConfig.ZugzwangTower.king);
  244. else desired = jQuery.extend(true, {}, trapConfig.ZugzwangTower.chessmaster);
  245. if (waktuTournament && unsafeWindow.user.viewing_atts.tournament.status == 'active' && waktuTrapCheck < waktuTitle && zzt_progress > 7) // jika mau trap check, lepas bait
  246. desired.bait = 0;
  247. if (trapConfig.ZugzwangTower.target == 3 && (desired.weapon == 354 || desired.weapon == 356) && zzt_mage_progress != zzt_tech_progress){
  248. if (zzt_mage_progress == zzt_progress && getComponentQuantity(354) > 0) desired.weapon = 354;
  249. if (zzt_tech_progress == zzt_progress && getComponentQuantity(356) > 0) desired.weapon = 356;
  250. } else if (trapConfig.ZugzwangTower.target == 3 && (desired.weapon == 369 || desired.weapon == 370) && zzt_mage_progress != zzt_tech_progress){
  251. if (zzt_mage_progress == zzt_progress && getComponentQuantity(369) > 0) desired.weapon = 369;
  252. if (zzt_tech_progress == zzt_progress && getComponentQuantity(370) > 0) desired.weapon = 370;
  253. }
  254. if (desired.bait == 371 && Math.max(zzt_mage_progress, zzt_tech_progress) >= 16 && getComponentQuantity(678) > 0) desired.trinket = 678;
  255. if (desired) return changeTrap(desired);
  256. } else if (unsafeWindow.user.environment_id == 33 && trapConfig.FieryWarpath.enabled) { // desert_warpath
  257. var wave = parseInt(unsafeWindow.user.viewing_atts.desert_warpath.wave);
  258. var pop = unsafeWindow.user.viewing_atts.desert_warpath.wave_population;
  259. var waveConf = trapConfig.FieryWarpath['wave' + wave];
  260. var sumPhysical = 0;
  261. if (wave < 4) for (var nama in pop){
  262. if (pop[nama].weakness.name == 'Physical') sumPhysical += parseInt(pop[nama].population);
  263. }
  264. $('div#hudLocationContent div[class^="opponent "][class$=" active"] img').css("border","none");
  265. if (wave == 4){
  266. var jum = 0;
  267. for (var boss in pop) if (parseInt(pop[boss].population) > 0) jum++;
  268. if (jum > 1) return changeTrap(trapConfig.FieryWarpath.warden);
  269. else return changeTrap(trapConfig.FieryWarpath.warmonger);
  270. }
  271. var streak = unsafeWindow.user.viewing_atts.desert_warpath.streak;
  272. var numStreak = parseInt(streak.quantity);
  273. var target;
  274. var jendral = unsafeWindow.user.viewing_atts.desert_warpath.common_population.desert_general;
  275. var weakness = 'Physical';
  276. if (!target) {
  277. if (jendral.status == 'active' && warpathGetTrinket('Commander', true) > 0 && warpathGetNumRetreat() >= waveConf.minGeneral){
  278. target = 'desert_general';
  279. } else if (numStreak > 0){
  280. weakness = pop[streak.mouse_type].weakness.name;
  281. if (numStreak < waveConf.maxStreak && parseInt(pop[streak.mouse_type].population) > 0){
  282. if ((weakness == 'Physical' || sumPhysical < 1 || (waveConf.allowNonPhysical && warpathGetTrinket(pop[streak.mouse_type].subgroup, true) > 0)) && weakness != 'Arcane')
  283. target = streak.mouse_type;
  284. } else if (waveConf.gargantua && numStreak > 6) target = 'Gargantua';
  285. }
  286. if (!target){
  287. if (sumPhysical > 0) {
  288. if (waveConf.targetPhysical) target = warpathGetPhysical(true, false);
  289. else target = warpathGetPhysical(false, false);
  290. } else {
  291. if (waveConf.targetNonPhysical) target = warpathGetPhysical(true, true, waveConf.charmNonPhysical);
  292. else target = warpathGetPhysical(false, true, waveConf.charmNonPhysical);
  293. }
  294. }
  295. }
  296. if (target=='Gargantua') {
  297. return changeTrap(jQuery.extend(true, {}, trapConfig.FieryWarpath.gargantua));
  298. }
  299. $('div#hudLocationContent div[class="opponent ' + target + ' active"] img').first().css("border","2px solid red");
  300. if (target=='desert_general') {
  301. var dt = jQuery.extend(true, {}, trapConfig.FieryWarpath.general);
  302. var x = warpathGetTrinket('Commander', true);
  303. if (x > 0) dt.trinket = x;
  304. return changeTrap(dt);
  305. } else {
  306. var dt = {weapon:-1, base:-1, trinket:-1, bait:-1};
  307. weakness = pop[target].weakness.name;
  308. var subgroup = pop[target].subgroup;
  309. if (weakness == 'Physical') dt = jQuery.extend(true, {}, trapConfig.FieryWarpath.physical);
  310. else if (weakness == 'Tactical') dt = jQuery.extend(true, {}, trapConfig.FieryWarpath.tactical);
  311. else if (weakness == 'Hydro') dt = jQuery.extend(true, {}, trapConfig.FieryWarpath.hydro);
  312. else if (weakness == 'Arcane') dt = jQuery.extend(true, {}, trapConfig.FieryWarpath.arcane);
  313. if (warpathGetGroupLeft() > 1) {
  314. var tr = 0;
  315. if (wave == 1 && numStreak < 1 && waveConf.openSelection){
  316. } else if (wave > 1 && weakness != 'Physical' && !waveConf.charmNonPhysical) {
  317. } else if (Math.pow(2,numStreak) & waveConf.superCharm) tr = warpathGetTrinket(subgroup, true);
  318. else tr = warpathGetTrinket(subgroup, false);
  319. if (tr > 0) dt.trinket = tr;
  320. }
  321. if ((Math.pow(2,numStreak) & waveConf.superBrie) && getComponentQuantity(114) > 0) dt.bait = 114;
  322. return changeTrap(dt);
  323. }
  324. } else if (unsafeWindow.user.environment_id == 39 && trapConfig.Iceberg.enabled) { // slushy_shoreline
  325. return changeTrap(trapConfig.Iceberg.slushy_shoreline);
  326. } else if (unsafeWindow.user.environment_id == 40 && trapConfig.Iceberg.enabled) { // iceberg
  327. var nextGeneral = 0;
  328. for (var x = 1; x <= 4 ; x++) {
  329. nextGeneral += unsafeWindow.user.quests.QuestIceberg.phases[x].length;
  330. if (unsafeWindow.user.quests.QuestIceberg.user_progress < nextGeneral) {
  331. switch (x) {
  332. case 1 : return changeTrap(trapConfig.Iceberg.phase1);
  333. case 2 : return changeTrap(trapConfig.Iceberg.phase2);
  334. case 3 : return changeTrap(trapConfig.Iceberg.phase3);
  335. case 4 : return changeTrap(trapConfig.Iceberg.phase4);
  336. }
  337. } else if (unsafeWindow.user.quests.QuestIceberg.user_progress == nextGeneral) {
  338. var dt = trapConfig.Iceberg.generals;
  339. if (trapConfig.Iceberg.altGeneralEnable) {
  340. if (!currentTrap.effmeter) {
  341. ajaxRequestEffMeter();
  342. return false;
  343. } else {
  344. dt = trapConfig.Iceberg.altgenerals;
  345. var count = 0;
  346. var mice;
  347. for (var d in currentTrap.effmeter){
  348. var diff = currentTrap.effmeter[d].mice;
  349. for (var m in diff) {
  350. count ++;
  351. mice = diff[m];
  352. if (count > 1) break;
  353. }
  354. if (count > 1) break;
  355. }
  356. if (count == 1 && mice.name==trapConfig.Iceberg.altGeneralEnable) dt = trapConfig.Iceberg.generals;
  357. }
  358. }
  359. return changeTrap(dt);
  360. }
  361. }
  362. return changeTrap(trapConfig.Iceberg.phase5);
  363. }
  364. return true;
  365. }
  366.  
  367. function changeTrap(desired){
  368. var salah;
  369. if (desired.weapon > 0 && desired.weapon != currentTrap.weapon && getComponentQuantity(desired.weapon) > 0) salah = 'weapon';
  370. else if (desired.base > 0 && desired.base != currentTrap.base && getComponentQuantity(desired.base) > 0) salah = 'base';
  371. else if (desired.trinket > -1 && desired.trinket != currentTrap.trinket && getComponentQuantity(desired.trinket) > 0) salah = 'trinket';
  372. else if (desired.bait > -1 && desired.bait != currentTrap.bait && getComponentQuantity(desired.bait) > 0) salah = 'bait';
  373.  
  374. if (salah) {
  375. if ($('div#mobileHorn').length > 0) {
  376. openLink('http://www.mousehuntgame.com/?switch_to=standard');
  377. return false;
  378. }
  379. if (typeof unsafeWindow.userTrapSelector == "undefined") {
  380. openLink('http://www.mousehuntgame.com/index.php');
  381. return false;
  382. }
  383. if (unsafeWindow.userTrapSelector.selectedComponentClass != salah) {
  384. if (salah === "weapon") {
  385. $('a#trapSelector-viewWeapon img').click();
  386. } else if (salah === "base") {
  387. $('a#trapSelector-viewBase img').click();
  388. } else if (salah === "trinket") {
  389. if ($('a#trapSelector-viewtrinket div.empty').length > 0) $('a#trapSelector-viewtrinket div.empty').click();
  390. else $('a#trapSelector-viewtrinket img').click();
  391. } else if (salah === "bait") {
  392. if ($('a#trapSelector-viewBait div.empty').length > 0) $('a#trapSelector-viewBait div.empty').click();
  393. else $('a#trapSelector-viewBait img').click();
  394. }
  395. }
  396. if (unsafeWindow.userTrapSelector.componentsCached == false) return false;
  397. var xDesired = desired[salah];
  398. var xCurrent = currentTrap[salah];
  399. if (xDesired == 0) {
  400. $('div[id="trapSelectorSelectedComponent"] div.content').click();
  401. } else {
  402. var nama = getComponentName(xDesired);
  403. if (nama){
  404. $('div[id="trapSelectorBrowser"] a[id="selectComponent-' + nama + '"] div.content').click();
  405. }
  406. }
  407. return false;
  408. }
  409. return true;
  410. }
  411.  
  412. function getComponentQuantity(itemid){
  413. if (itemid == 0) return 1;
  414. for (var nama in availableTraps){
  415. if (availableTraps[nama].item_id == itemid) {
  416. return availableTraps[nama].quantity;
  417. }
  418. }
  419. return 0;
  420. }
  421.  
  422. function getComponentName(itemid){
  423. if (typeof unsafeWindow.userTrapSelector == "undefined" || typeof unsafeWindow.userTrapSelector.availableComponents == "undefined") return null;
  424. for (var nama in unsafeWindow.userTrapSelector.availableComponents){
  425. if (unsafeWindow.userTrapSelector.availableComponents[nama].item_id == itemid) {
  426. return unsafeWindow.userTrapSelector.availableComponents[nama].type;
  427. }
  428. }
  429. return null;
  430. }
  431.  
  432. function travelTo(origin, destination) {
  433. if (origin === destination) return true;
  434. if ($('div#mobileHorn').length > 0) {
  435. openLink('http://www.mousehuntgame.com/?switch_to=standard');
  436. return false;
  437. }
  438. if (destination === 'meadow') {
  439. openLink('http://www.mousehuntgame.com/travel.php?freeTravel=true?&uh=' + unsafeWindow.user.unique_hash);
  440. return false;
  441. } else {
  442. var ajax=new unsafeWindow.Ajax();
  443. ajax.requireLogin=true;
  444. ajax.responseType=unsafeWindow.Ajax.JSON;
  445. ajax.ondone=function(resp){
  446. if(resp.success){
  447. try{
  448. unsafeWindow.eventRegistry.doEvent('ajax_response',resp);
  449. unsafeWindow.eventRegistry.doEvent('travel_complete',{'old':origin,'new':destination});
  450. } catch (err) {
  451. }
  452. try{
  453. unsafeWindow.app.views.HeadsUpDisplayView.hud.render(resp.user);
  454. } catch (err) {
  455. }
  456. }
  457. }
  458. var params={"origin":origin,"destination":destination,'uh':unsafeWindow.user.unique_hash};
  459. ajax.post(unsafeWindow.callbackurl+"managers/ajax/users/changeenvironment.php",params);
  460. return false;
  461. }
  462. }
  463.  
  464. function soundTheHorn(){
  465. if (typeof unsafeWindow.user == 'undefined' || unsafeWindow.user.has_puzzle || !hornAllowed) return;
  466. if ($('div#hornArea div.hornbutton').css('display')=='block')
  467. if (document.location.pathname == '/') document.location = hornpage;
  468. else $('div#hornArea div.hornbutton a').click();
  469. else if ($('div#mobileHorn').css('display')=='block') openLink(hornpage);
  470. else randomLinks();
  471. }
  472.  
  473. function mulai(){
  474. clearTimeout(timerEvent);
  475. if (typeof unsafeWindow.user == "undefined") { setTimeout(function() { mulai(); }, 1000); return; }
  476. var waktu;
  477. var isKR = true;
  478. var userid = 0;
  479. var bait_quantity = 0;
  480. try {
  481. if (typeof unsafeWindow.HuntersHorn != "undefined")
  482. waktu = unsafeWindow.HuntersHorn.getSecondsRemaining();
  483. else
  484. waktu = parseInt(unsafeWindow.user.next_activeturn_seconds);
  485. isKR = unsafeWindow.user.has_puzzle;
  486. userid = parseInt(unsafeWindow.user.user_id);
  487. bait_quantity = parseInt(unsafeWindow.user.bait_quantity);
  488. } catch (err) {
  489. setTimeout(function() { mulai(); }, 1000);
  490. return;
  491. }
  492. if (isNaN(userid) || userid < 1) {
  493. setTimeout(function() {
  494. openLink(defaultpage);
  495. } , 60000);
  496. return;
  497. }
  498. if (waktu > 0) waktuTitle = new Date(new Date().getTime() + waktu * 1000);
  499. cleanupLink();
  500. if ($('div#tournamentStatusHud div.timer').length > 0){
  501. waktuTournament = new Date(new Date().getTime() + unsafeWindow.user.viewing_atts.tournament.seconds_remaining * 1000);
  502. }
  503. if (isKR==true) {
  504. if (!alertShown) {
  505. alertShown = true;
  506. if (loadParam('enableAlert', false)) soundAlarm(); else alert('King Reward');
  507. }
  508. var timeoutvalue = Math.round(Math.random() * Math.abs((loadParam('maxKRWait', 180) - loadParam('minKRWait', 180)) * 60000)) + loadParam('minKRWait', 180) * 60000;
  509. timerEvent = setTimeout(function() { randomLinks(); } , timeoutvalue);
  510. waktuRandom = new Date(new Date().getTime() + timeoutvalue);
  511. waktuNextHorn = null;
  512. msgTitle = 'King Reward';
  513. waktuTitle = new Date();
  514. return;
  515. }
  516. currentTrap.weapon = unsafeWindow.user.weapon_item_id;
  517. currentTrap.base = unsafeWindow.user.base_item_id;
  518. currentTrap.trinket = (parseInt(unsafeWindow.user.trinket_item_id) > 0 ? parseInt(unsafeWindow.user.trinket_item_id) : 0);
  519. currentTrap.bait = (parseInt(unsafeWindow.user.bait_item_id) > 0 ? parseInt(unsafeWindow.user.bait_item_id) : 0);
  520. if (currentTrap.trinket == 0) {
  521. $('span#hud_trinketName a').html('None&nbsp;');
  522. $('span#hud_trinketQuantity').html('0');
  523. } else {
  524. $('span#hud_trinketName a').html(unsafeWindow.user.trinket_name + '&nbsp;');
  525. $('span#hud_trinketQuantity').html(unsafeWindow.user.trinket_quantity);
  526. }
  527.  
  528. calculateTrapCheck();
  529. $('span#hud_titlePercentage').html(unsafeWindow.user.title_percentage);
  530.  
  531. hornAllowed = checkLocation();
  532. if (bait_quantity < 1) hornAllowed = false;
  533. if (waktu == 0 && hornAllowed) {
  534. soundTheHorn();
  535. return;
  536. } else if (waktu > 0){
  537. msgTitle = 'Sound The Horn';
  538. var timeoutvalue = waktu + Math.round(Math.random() * Math.abs(loadParam('maxHornDelay', 120) - loadParam('minHornDelay', 30))) + loadParam('minHornDelay', 30);
  539. waktuNextHorn = new Date(new Date().getTime() + timeoutvalue * 1000);
  540. timerEvent = setTimeout(function() {
  541. if (!hornAllowed) return;
  542. if ($('div#hornArea div.hornbutton').css('display') == 'block' || $('div#mobileHorn').css('display') == 'block') {
  543. soundTheHorn();
  544. } else
  545. randomLinks();
  546. }, timeoutvalue * 1000);
  547. }
  548. }
  549.  
  550. function populateComboTrap(obj){
  551. var list = [];
  552. for (var x in obj) list.push(obj[x]);
  553. list.sort(function(a, b){
  554. return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
  555. });
  556. for (var nama in list){
  557. var id = list[nama].item_id;
  558. var name = list[nama].name;
  559. var classification = list[nama].classification;
  560. if (classification === 'base')
  561. $('div#AutoHornWindow select[name^="cbo"][name$="Base"]').each(function(){
  562. $(this).append('<option value="' + id + '" title="' + name + '">' + name + '</option>');
  563. });
  564. else if (classification === 'weapon')
  565. $('div#AutoHornWindow select[name^="cbo"][name$="Weapon"]').each(function(){
  566. $(this).append('<option value="' + id + '" title="' + name + '">' + name + '</option>');
  567. });
  568. else if (classification === 'trinket')
  569. $('div#AutoHornWindow select[name^="cbo"][name$="Trinket"]').each(function(){
  570. $(this).append('<option value="' + id + '" title="' + name + '">' + name + ' (' + list[nama].quantity + ')</option>');
  571. });
  572. else if (classification === 'bait')
  573. $('div#AutoHornWindow select[name^="cbo"][name$="Bait"]').each(function(){
  574. $(this).append('<option value="' + id + '" title="' + name + '">' + name + ' (' + list[nama].quantity + ')</option>');
  575. });
  576. }
  577. }
  578.  
  579. function setSelectionComboTrap(name, trap){
  580. $('div#AutoHornWindow select[name="cbo' + name + 'Base"] option[value="' + trap.base + '"]').attr('selected', 'selected');
  581. $('div#AutoHornWindow select[name="cbo' + name + 'Weapon"] option[value="' + trap.weapon + '"]').attr('selected', 'selected');
  582. $('div#AutoHornWindow select[name="cbo' + name + 'Trinket"] option[value="' + trap.trinket + '"]').attr('selected', 'selected');
  583. $('div#AutoHornWindow select[name="cbo' + name + 'Bait"] option[value="' + trap.bait + '"]').attr('selected', 'selected');
  584. }
  585.  
  586. function getSelectionComboTrap(name, trap){
  587. trap.base = $('div#AutoHornWindow select[name="cbo' + name + 'Base"]').val();
  588. trap.weapon = $('div#AutoHornWindow select[name="cbo' + name + 'Weapon"]').val();
  589. trap.trinket = $('div#AutoHornWindow select[name="cbo' + name + 'Trinket"]').val();
  590. trap.bait = $('div#AutoHornWindow select[name="cbo' + name + 'Bait"]').val();
  591. }
  592.  
  593. function generateTrapSetupCombo(mid){
  594. return '<select name="cbo' + mid + 'Base"><option value="-1">Any</option></select> <select name="cbo' + mid + 'Weapon"><option value="-1">Any</option></select> <select name="cbo' + mid + 'Trinket"><option value="-1">Any</option><option value="0">None</option></select> <select name="cbo' + mid + 'Bait"><option value="-1">Any</option></select>';
  595. }
  596.  
  597. function showBalackPage(){
  598. $('div#AutoHornWindow a[href="#save"]').unbind('click');
  599. $('div#AutoHornWindow a[href="#default"]').unbind('click');
  600. $('div#AutoHornWindow div[name="top"]').html('Balack\'s Cove Configuration');
  601. $('div#AutoHornWindow div[name="main"]').html('<ul><span class="groupTitle">General</span>' +
  602. '<li tittle="toggle enable/disable setup on this page"><span class="paramDesc">Enable</span><input type="checkbox" name="chkEnable" />Use setup below for each conditions</li>' +
  603. '<li tittle="Auto travel to Balack Cove"><span class="paramDesc">Auto Travel</span><input type="checkbox" name="chkTravel" />Travel to Balack Cove when washed to JoD</li>' +
  604. '</ul><ul><span class="groupTitle">Trap Setup</span>' +
  605. '<li title="You won\'t transferred automatically to Cove if you don\'t have Vengeful or Vanilla Stilton, hunt in JoD with this setup"><span class="paramDesc">Jungle of Dread</span>' + generateTrapSetupCombo('Jungle') + '</li>' +
  606. '<li title="Trap setup when high tide"><span class="paramDesc">High Tide</span>' + generateTrapSetupCombo('high') + '</li>' +
  607. '<li title="Trap setup when mid tide"><span class="paramDesc">Mid Tide</span>' + generateTrapSetupCombo('mid') + '</li>' +
  608. '<li title="Trap setup when low tide"><span class="paramDesc">Low Tide</span>' + generateTrapSetupCombo('low') + '</li>' +
  609.  
  610. '</ul><br>');
  611. $('div#AutoHornWindow div[name="main"]').css({'overflow-y':'auto', 'height':'350px'});
  612. $('div#AutoHornWindow div[name="main"] ul').css({'list-style-type':'none','margin':'0px'});
  613. $('div#AutoHornWindow div[name="main"] .groupTitle').css({'font-weight':'bold','font-size':'1.2em'});
  614. $('div#AutoHornWindow div[name="main"] .paramDesc').css({'font-weight':'bold','float':'left','width':'150', 'padding-left':'20px'});
  615. $('div#AutoHornWindow div[name="main"] select').css({'width':'300px'});
  616. $('div#AutoHornWindow div[name="main"] input.short').css({'width':'20px'});
  617. $('div#AutoHornWindow div[name="main"] br').css({'clear':'left'});
  618. populateComboTrap(availableTraps);
  619.  
  620. $('div#AutoHornWindow div[name="main"] select').css({'width':'100px'});
  621.  
  622. if (trapConfig.BalackCove.enabled) $('div#AutoHornWindow input[name="chkEnable"]').attr('checked', 'checked');
  623. if (trapConfig.BalackCove.travel) $('div#AutoHornWindow input[name="chkTravel"]').attr('checked', 'checked');
  624. setSelectionComboTrap('Jungle', trapConfig.BalackCove.jod);
  625. setSelectionComboTrap('high', trapConfig.BalackCove.high);
  626. setSelectionComboTrap('mid', trapConfig.BalackCove.mid);
  627. setSelectionComboTrap('low', trapConfig.BalackCove.low);
  628.  
  629. $('div#AutoHornWindow a[href="#save"]').click(function(e){
  630. e.preventDefault();
  631. trapConfig.BalackCove.enabled = $('div#AutoHornWindow input[name="chkEnable"]:checked').length;
  632. trapConfig.BalackCove.travel = $('div#AutoHornWindow input[name="chkTravel"]:checked').length;
  633. getSelectionComboTrap('Jungle', trapConfig.BalackCove.jod);
  634. getSelectionComboTrap('high', trapConfig.BalackCove.high);
  635. getSelectionComboTrap('mid', trapConfig.BalackCove.mid);
  636. getSelectionComboTrap('low', trapConfig.BalackCove.low);
  637. var str = JSON.stringify(trapConfig);
  638. saveParam('trapConfig', str);
  639. $('div#AutoHornWindow').hide();
  640. $('div#AutoHornMask').hide();
  641. checkLocation();
  642. });
  643. $('div#AutoHornWindow a[href="#default"]').click(function(e){
  644. e.preventDefault();
  645. $('div#AutoHornWindow input[name="chkEnable"]').removeAttr('checked');
  646. $('div#AutoHornWindow input[name="chkTravel"]').removeAttr('checked');
  647. $('div#AutoHornWindow select[name^="cbo"] option').each(function(){ $(this).removeAttr('selected'); });
  648. });
  649. var winH = $(window).height();
  650. var winW = $(window).width();
  651. $('div#AutoHornWindow').css({'top':(winH - $('div#AutoHornWindow').height())/2, 'left':(winW - $('div#AutoHornWindow').width())/2});
  652. $('div#AutoHornMask').css({'top':'0', 'left':'0', 'width':winW, 'height':winH});
  653. $('div#AutoHornMask').fadeTo(0,0.8);
  654. $('div#AutoHornWindow').fadeIn(2000);
  655. }
  656.  
  657. function showWarpathPage(){
  658. $('div#AutoHornWindow a[href="#save"]').unbind('click');
  659. $('div#AutoHornWindow a[href="#default"]').unbind('click');
  660. $('div#AutoHornWindow div[name="top"]').html('Warpath Configuration');
  661. $('div#AutoHornWindow div[name="main"]').html('<ul><span class="groupTitle">General</span>' +
  662. '<li tittle="toggle enable/disable setup on this page"><span class="paramDesc">Enable</span><input type="checkbox" name="chkEnable" />Use setup below for each conditions</li>' +
  663. '</ul><ul><span class="groupTitle">Trap Setup</span>' +
  664. '<li title="Against Warrior, Scout, and Archer"><span class="paramDesc">Physical</span>' + generateTrapSetupCombo('Physical') + '</li>' +
  665. '<li title="Tactical setup against Cavalry"><span class="paramDesc">Cavalry</span>' + generateTrapSetupCombo('Tactical') + '</li>' +
  666. '<li title="Hydro setup against Mage"><span class="paramDesc">Mage</span>' + generateTrapSetupCombo('Hydro') + '</li>' +
  667. '<li title="Arcane setup against Artillery"><span class="paramDesc">Artillery</span>' + generateTrapSetupCombo('Arcane') + '</li>' +
  668. '<li title="Trap setup against Commander"><span class="paramDesc">Commander</span>' + generateTrapSetupCombo('General') + '</li>' +
  669. '<li title="Trap setup against Gargantua"><span class="paramDesc">Gargantua</span>' + generateTrapSetupCombo('Gargantua') + '</li>' +
  670. '<li title="Trap setup against Theurgy Warden"><span class="paramDesc">Theurgy Warden</span>' + generateTrapSetupCombo('Warden') + '</li>' +
  671. '<li title="Trap setup against Warmonger"><span class="paramDesc">Warmonger</span>' + generateTrapSetupCombo('Warmonger') + '</li>' +
  672.  
  673. '</ul><ul><span class="groupTitle">Wave 1</span>' +
  674. '<li title="Strategy used when no streak"><span class="paramDesc">No Streak</span><input type="radio" name="wave1openSelection" value="true" />don\'t waste charm <input type="radio" name="wave1openSelection" value="false" />use charm</li>' +
  675. '<li title="Strategy used against physical mouse"><span class="paramDesc">Physical Targeting</span><input type="radio" name="wave1targetPhysical" value="true" />max population <input type="radio" name="wave1targetPhysical" value="false" />min population</li>' +
  676. '<li title="Streak to use SuperBrie (if available)" class="wave1superBrie-eachstreak"><span class="paramDesc">SuperBrie</span></li>' +
  677. '<li title="Streak to use Super version of charm (if available)" class="wave1superCharm-eachstreak"><span class="paramDesc">SuperCharm</span></li>' +
  678. '<li title="Commander Charm use"><span class="paramDesc">Commander</span>Aim for commander if at least <input type="text" name="wave1minGeneral" class="short" /> mouse will retreat</li>' +
  679. '<li title="Target maximum streak"><span class="paramDesc">Max Streak</span><input type="text" name="wave1maxStreak" class="short" /> streaks, then <input type="radio" name="wave1gargantua" value="true" />aim for gargantua <input type="radio" name="wave1gargantua" value="false" />continue next cycle</li>' +
  680.  
  681. '</ul><ul><span class="groupTitle">Wave 2</span>' +
  682. '<li title="Strategy used against physical mouse"><span class="paramDesc">Physical Targeting</span><input type="radio" name="wave2targetPhysical" value="true" />max population <input type="radio" name="wave2targetPhysical" value="false" />min population</li>' +
  683. '<li title="Strategy used against non-physical mouse"><span class="paramDesc">Non-Physical Targeting</span><input type="radio" name="wave2targetNonPhysical" value="true" />max population <input type="radio" name="wave2targetNonPhysical" value="false" />min population</li>' +
  684. '<li title="Should cham used against non-physical mouse if any"><span class="paramDesc">Non-Physical Charm</span><input type="radio" name="wave2charmNonPhysical" value="true" />Yes, use charms <input type="radio" name="wave2charmNonPhysical" value="false" />No, keep those charms</li>' +
  685. '<li title="Allow targeting non-physical when accidentally cathed even if physical exist"><span class="paramDesc">Allow Non-Physical Streak</span><input type="radio" name="wave2allowNonPhysical" value="true" />Yes, only if I have required charm <input type="radio" name="wave2allowNonPhysical" value="false" />No, physical first</li>' +
  686. '<li title="Streak to use SuperBrie (if available)" class="wave2superBrie-eachstreak"><span class="paramDesc">SuperBrie</span></li>' +
  687. '<li title="Streak to use Super version of charm (if available)" class="wave2superCharm-eachstreak"><span class="paramDesc">SuperCharm</span></li>' +
  688. '<li title="Commander Charm use"><span class="paramDesc">Commander</span>Aim for commander if at least <input type="text" name="wave2minGeneral" class="short" /> mouse will retreat</li>' +
  689. '<li title="Target maximum streak"><span class="paramDesc">Max Streak</span><input type="text" name="wave2maxStreak" class="short" /> streaks, then <input type="radio" name="wave2gargantua" value="true" />aim for gargantua <input type="radio" name="wave2gargantua" value="false" />continue next cycle</li>' +
  690.  
  691. '</ul><ul><span class="groupTitle">Wave 3</span>' +
  692. '<li title="Strategy used against physical mouse"><span class="paramDesc">Physical Targeting</span><input type="radio" name="wave3targetPhysical" value="true" />max population <input type="radio" name="wave3targetPhysical" value="false" />min population</li>' +
  693. '<li title="Strategy used against non-physical mouse"><span class="paramDesc">Non-Physical Targeting</span><input type="radio" name="wave3targetNonPhysical" value="true" />max population <input type="radio" name="wave3targetNonPhysical" value="false" />min population</li>' +
  694. '<li title="Should cham used against non-physical mouse if any"><span class="paramDesc">Non-Physical Charm</span><input type="radio" name="wave3charmNonPhysical" value="true" />Yes, use charms <input type="radio" name="wave3charmNonPhysical" value="false" />No, keep those charms</li>' +
  695. '<li title="Allow targeting non-physical when accidentally cathed even if physical exist"><span class="paramDesc">Allow Non-Physical Streak</span><input type="radio" name="wave3allowNonPhysical" value="true" />Yes, only if I have required charm <input type="radio" name="wave3allowNonPhysical" value="false" />No, physical first</li>' +
  696. '<li title="Streak to use SuperBrie (if available)" class="wave3superBrie-eachstreak"><span class="paramDesc">SuperBrie</span></li>' +
  697. '<li title="Streak to use Super version of charm (if available)" class="wave3superCharm-eachstreak"><span class="paramDesc">SuperCharm</span></li>' +
  698. '<li title="Commander Charm use"><span class="paramDesc">Commander</span>Aim for commander if at least <input type="text" name="wave3minGeneral" class="short" /> mouse will retreat</li>' +
  699. '<li title="Target maximum streak"><span class="paramDesc">Max Streak</span><input type="text" name="wave3maxStreak" class="short" /> streaks, then <input type="radio" name="wave3gargantua" value="true" />aim for gargantua <input type="radio" name="wave3gargantua" value="false" />continue next cycle</li>' +
  700.  
  701. '</ul><br>');
  702. for (var i = 0; i < 13; i++){
  703. $('div#AutoHornWindow div[name="main"] li[class$="-eachstreak"]').each(function(){
  704. var kelas = $(this).attr('class');
  705. kelas = kelas.substring(0,kelas.lastIndexOf('-'));
  706. var checked = trapConfig.FieryWarpath[kelas.substring(0,5)][kelas.substring(5)] & Math.pow(2,i);
  707. $(this).append('<input type="checkbox" name="' + (kelas + '-' + i) + '" ' + (checked ? 'checked="checked" ' : "") + '/>' + i + ' ');
  708. });
  709. }
  710. $('div#AutoHornWindow div[name="main"]').css({'overflow-y':'auto', 'height':'350px'});
  711. $('div#AutoHornWindow div[name="main"] ul').css({'list-style-type':'none','margin':'0px'});
  712. $('div#AutoHornWindow div[name="main"] .groupTitle').css({'font-weight':'bold','font-size':'1.2em'});
  713. $('div#AutoHornWindow div[name="main"] .paramDesc').css({'font-weight':'bold','float':'left','width':'150', 'padding-left':'20px'});
  714. $('div#AutoHornWindow div[name="main"] select').css({'width':'300px'});
  715. $('div#AutoHornWindow div[name="main"] input.short').css({'width':'20px'});
  716. $('div#AutoHornWindow div[name="main"] br').css({'clear':'left'});
  717. populateComboTrap(availableTraps);
  718.  
  719. $('div#AutoHornWindow div[name="main"] select').css({'width':'100px'});
  720.  
  721. if (trapConfig.FieryWarpath.enabled) $('div#AutoHornWindow input[name="chkEnable"]').attr('checked', 'checked');
  722. setSelectionComboTrap('Physical', trapConfig.FieryWarpath.physical);
  723. setSelectionComboTrap('Tactical', trapConfig.FieryWarpath.tactical);
  724. setSelectionComboTrap('Hydro', trapConfig.FieryWarpath.hydro);
  725. setSelectionComboTrap('Arcane', trapConfig.FieryWarpath.arcane);
  726. setSelectionComboTrap('General', trapConfig.FieryWarpath.general);
  727. setSelectionComboTrap('Gargantua', trapConfig.FieryWarpath.gargantua);
  728. setSelectionComboTrap('Warden', trapConfig.FieryWarpath.warden);
  729. setSelectionComboTrap('Warmonger', trapConfig.FieryWarpath.warmonger);
  730. $('div#AutoHornWindow div[name="main"] input[name^="wave"]').not('li[class$="-eachstreak"] input').each(function(){
  731. var nilai = trapConfig.FieryWarpath[$(this).attr('name').substring(0,5)][$(this).attr('name').substring(5)];
  732. if ($(this).attr('type') == "text") {
  733. $(this).val(nilai);
  734. } else if ($(this).attr('type') == "radio"){
  735. if (new String(nilai) == $(this).val()) $(this).attr("checked","checked");
  736. }
  737. });
  738.  
  739. $('div#AutoHornWindow a[href="#save"]').click(function(e){
  740. e.preventDefault();
  741. trapConfig.FieryWarpath.enabled = $('div#AutoHornWindow input[name="chkEnable"]:checked').length;
  742. getSelectionComboTrap('Physical', trapConfig.FieryWarpath.physical);
  743. getSelectionComboTrap('Tactical', trapConfig.FieryWarpath.tactical);
  744. getSelectionComboTrap('Hydro', trapConfig.FieryWarpath.hydro);
  745. getSelectionComboTrap('Arcane', trapConfig.FieryWarpath.arcane);
  746. getSelectionComboTrap('General', trapConfig.FieryWarpath.general);
  747. getSelectionComboTrap('Gargantua', trapConfig.FieryWarpath.gargantua);
  748. getSelectionComboTrap('Warden', trapConfig.FieryWarpath.warden);
  749. getSelectionComboTrap('Warmonger', trapConfig.FieryWarpath.warmonger);
  750. $('div#AutoHornWindow div[name="main"] input[name^="wave"]').not('li[class$="-eachstreak"] input').each(function(){
  751. var nilai;
  752. if ($(this).attr('type') == "text") {
  753. nilai = (isNaN($(this).val()) ? $(this).val() : parseInt($(this).val()));
  754. trapConfig.FieryWarpath[$(this).attr('name').substring(0,5)][$(this).attr('name').substring(5)] = nilai;
  755. } else if ($(this).attr('type') == "radio" && $(this).attr('checked')){
  756. if ($(this).val() == 'true') nilai = true;
  757. else if ($(this).val() == 'false') nilai = false;
  758. else nilai = $(this).val();
  759. trapConfig.FieryWarpath[$(this).attr('name').substring(0,5)][$(this).attr('name').substring(5)] = nilai;
  760. }
  761. });
  762. var tmp = {wave1:{superBrie:0,superCharm:0},wave2:{superBrie:0,superCharm:0},wave3:{superBrie:0,superCharm:0}};
  763. $('div#AutoHornWindow div[name="main"] li[class$="-eachstreak"] input:checked').each(function(){
  764. var nama = $(this).attr('name');
  765. tmp[nama.substring(0,5)][nama.substring(5, nama.lastIndexOf('-'))] += Math.pow(2,parseInt(nama.substring(nama.lastIndexOf('-') + 1)));
  766. });
  767. jQuery.extend(true, trapConfig.FieryWarpath, tmp);
  768. var str = JSON.stringify(trapConfig);
  769. saveParam('trapConfig', str);
  770. $('div#AutoHornWindow').hide();
  771. $('div#AutoHornMask').hide();
  772. checkLocation();
  773. });
  774. $('div#AutoHornWindow a[href="#default"]').click(function(e){
  775. e.preventDefault();
  776. $('div#AutoHornWindow input[name="chkEnable"]').removeAttr('checked');
  777. $('div#AutoHornWindow select[name^="cbo"] option').each(function(){ $(this).removeAttr('selected'); });
  778. var def = {wave1:{maxStreak:9,gargantua:true,minGeneral:99,targetPhysical:true,charmNonPhysical:false,openSelection:true},wave2:{maxStreak:9,gargantua:true,minGeneral:99,targetPhysical:true,charmNonPhysical:true,targetNonPhysical:false,allowNonPhysical:false},wave3:{maxStreak:9,gargantua:true,minGeneral:99,targetPhysical:true,charmNonPhysical:true,targetNonPhysical:false,allowNonPhysical:false}};
  779. $('div#AutoHornWindow div[name="main"] input[name^="wave"]').not('li[class$="-eachstreak"] input').each(function(){
  780. var nilai = def[$(this).attr('name').substring(0,5)][$(this).attr('name').substring(5)];
  781. if ($(this).attr('type') == "text") {
  782. $(this).val(nilai);
  783. } else if ($(this).attr('type') == "radio"){
  784. if (new String(nilai) == $(this).val()) $(this).attr("checked","checked");
  785. }
  786. });
  787. $('div#AutoHornWindow div[name="main"] li[class$="-eachstreak"] input').each(function(){
  788. $(this).removeAttr('checked');
  789. });
  790. });
  791. var winH = $(window).height();
  792. var winW = $(window).width();
  793. $('div#AutoHornWindow').css({'top':(winH - $('div#AutoHornWindow').height())/2, 'left':(winW - $('div#AutoHornWindow').width())/2});
  794. $('div#AutoHornMask').css({'top':'0', 'left':'0', 'width':winW, 'height':winH});
  795. $('div#AutoHornMask').fadeTo(0,0.8);
  796. $('div#AutoHornWindow').fadeIn(2000);
  797. }
  798.  
  799. function showIcebergPage(){
  800. $('div#AutoHornWindow a[href="#save"]').unbind('click');
  801. $('div#AutoHornWindow a[href="#default"]').unbind('click');
  802. $('div#AutoHornWindow div[name="top"]').html('Iceberg Configuration');
  803. $('div#AutoHornWindow div[name="main"]').html('<ul><span class="groupTitle">General</span>' +
  804. '<li tittle="toggle enable/disable setup on this page"><span class="paramDesc">Enable</span><input type="checkbox" name="chkEnable" />Use setup below for each conditions</li>' +
  805. '</ul><ul><span class="groupTitle">Trap Setup</span>' +
  806. '<li title="Trap setup for Slushy Shoreline"><span class="paramDesc">Slushy Shoreline</span>' + generateTrapSetupCombo('Slushy') + '</li>' +
  807. '<li title="Trap setup for phase 1 (Treacherous Tunnels)"><span class="paramDesc">Treacherous Tunnels</span>' + generateTrapSetupCombo('Phase1') + '</li>' +
  808. '<li title="Trap setup for phase 2 (Brutal Bulwark)"><span class="paramDesc">Brutal Bulwark</span>' + generateTrapSetupCombo('Phase2') + '</li>' +
  809. '<li title="Trap setup for phase 3 (Bombing Run)"><span class="paramDesc">Bombing Run</span>' + generateTrapSetupCombo('Phase3') + '</li>' +
  810. '<li title="Trap setup for phase 4 (The Mad Depths)"><span class="paramDesc">The Mad Depths</span>' + generateTrapSetupCombo('Phase4') + '</li>' +
  811. '<li title="Trap setup for phase 5 (Icewing\'s Lair)"><span class="paramDesc">Icewing\'s Lair</span>' + generateTrapSetupCombo('Phase5') + '</select></li>' +
  812. '<li title="Trap setup when meeting generals"><span class="paramDesc">Generals</span>' + generateTrapSetupCombo('General') + '</li>' +
  813. '</ul><ul><span class="groupTitle">Iceberg Generals</span>' +
  814. '<li title="Try to catch specific general"><span class="paramDesc">Specific General</span><input type="checkbox" name="chkAltGeneral" />Try to get <select name="cboAltGeneral"><option value="General Drheller">General Drheller</option><option value="Princess Fist">Princess Fist</option><option value="Lady Coldsnap">Lady Coldsnap</option><option value="Lord Splodington">Lord Splodington</option></select></li>' +
  815. '<li title="Trap setup for general evasion, should be non-hydro"><span class="paramDesc">Evasion Setup</span>' + generateTrapSetupCombo('AltGeneral') + '</li>' +
  816. '</ul><br>');
  817.  
  818. $('div#AutoHornWindow div[name="main"]').css({'overflow-y':'auto', 'height':'350px'});
  819. $('div#AutoHornWindow div[name="main"] ul').css({'list-style-type':'none','margin':'0px'});
  820. $('div#AutoHornWindow div[name="main"] .groupTitle').css({'font-weight':'bold','font-size':'1.2em'});
  821. $('div#AutoHornWindow div[name="main"] .paramDesc').css({'font-weight':'bold','float':'left','width':'150', 'padding-left':'20px'});
  822. $('div#AutoHornWindow div[name="main"] select').css({'width':'300px'});
  823. $('div#AutoHornWindow div[name="main"] br').css({'clear':'left'});
  824. populateComboTrap(availableTraps);
  825.  
  826. $('div#AutoHornWindow div[name="main"] select').css({'width':'100px'});
  827.  
  828. if (trapConfig.Iceberg.enabled) $('div#AutoHornWindow input[name="chkEnable"]').attr('checked', 'checked');
  829. if (trapConfig.Iceberg.altGeneralEnable) {
  830. $('div#AutoHornWindow input[name="chkAltGeneral"]').attr('checked', 'checked');
  831. $('div#AutoHornWindow select[name="cboAltGeneral"] option[value="' + trapConfig.Iceberg.altGeneralEnable + '"]').attr('selected', 'selected');
  832. }
  833. setSelectionComboTrap('Slushy', trapConfig.Iceberg.slushy_shoreline);
  834. setSelectionComboTrap('Phase1', trapConfig.Iceberg.phase1);
  835. setSelectionComboTrap('Phase2', trapConfig.Iceberg.phase2);
  836. setSelectionComboTrap('Phase3', trapConfig.Iceberg.phase3);
  837. setSelectionComboTrap('Phase4', trapConfig.Iceberg.phase4);
  838. setSelectionComboTrap('Phase5', trapConfig.Iceberg.phase5);
  839. setSelectionComboTrap('General', trapConfig.Iceberg.generals);
  840. setSelectionComboTrap('AltGeneral', trapConfig.Iceberg.altgenerals);
  841.  
  842. $('div#AutoHornWindow a[href="#save"]').click(function(e){
  843. e.preventDefault();
  844. trapConfig.Iceberg.enabled = $('div#AutoHornWindow input[name="chkEnable"]:checked').length;
  845. if ($('div#AutoHornWindow input[name="chkAltGeneral"]:checked').length > 0)
  846. trapConfig.Iceberg.altGeneralEnable = $('div#AutoHornWindow select[name="cboAltGeneral"]').val();
  847. else
  848. trapConfig.Iceberg.altGeneralEnable = 0;
  849. getSelectionComboTrap('Slushy', trapConfig.Iceberg.slushy_shoreline);
  850. getSelectionComboTrap('Phase1', trapConfig.Iceberg.phase1);
  851. getSelectionComboTrap('Phase2', trapConfig.Iceberg.phase2);
  852. getSelectionComboTrap('Phase3', trapConfig.Iceberg.phase3);
  853. getSelectionComboTrap('Phase4', trapConfig.Iceberg.phase4);
  854. getSelectionComboTrap('Phase5', trapConfig.Iceberg.phase5);
  855. getSelectionComboTrap('General', trapConfig.Iceberg.generals);
  856. getSelectionComboTrap('AltGeneral', trapConfig.Iceberg.altgenerals);
  857.  
  858. var str = JSON.stringify(trapConfig);
  859. saveParam('trapConfig', str);
  860. $('div#AutoHornWindow').hide();
  861. $('div#AutoHornMask').hide();
  862. checkLocation();
  863. });
  864. $('div#AutoHornWindow a[href="#default"]').click(function(e){
  865. e.preventDefault();
  866. $('div#AutoHornWindow input[name="chkEnable"]').removeAttr('checked');
  867. $('div#AutoHornWindow input[name="chkAltGeneral"]').removeAttr('checked');
  868. $('div#AutoHornWindow select[name^="cbo"] option').each(function(){ $(this).removeAttr('selected'); });
  869. });
  870. var winH = $(window).height();
  871. var winW = $(window).width();
  872. $('div#AutoHornWindow').css({'top':(winH - $('div#AutoHornWindow').height())/2, 'left':(winW - $('div#AutoHornWindow').width())/2});
  873. $('div#AutoHornMask').css({'top':'0', 'left':'0', 'width':winW, 'height':winH});
  874. $('div#AutoHornMask').fadeTo(0,0.8);
  875. $('div#AutoHornWindow').fadeIn(2000);
  876. }
  877.  
  878. function showZugzwangPage(){
  879. $('div#AutoHornWindow a[href="#save"]').unbind('click');
  880. $('div#AutoHornWindow a[href="#default"]').unbind('click');
  881. $('div#AutoHornWindow div[name="top"]').html('Zugzwang Configuration');
  882. $('div#AutoHornWindow div[name="main"]').html('<ul><span class="groupTitle">General</span>' +
  883. '<li tittle="toggle enable/disable setup on this page"><span class="paramDesc">Enable</span><input type="checkbox" name="chkEnable" />Use setup below</li>' +
  884. '</ul><ul><span class="groupTitle">Seasonal Garden</span>' +
  885. '<li tittle="Automatically Travel to tower when amplifier full"><span class="paramDesc">Auto Travel</span><input type="radio" name="autoTravel" value="true" />Yes, travel when my amplifier full <input type="radio" name="autoTravel" value="false" />No, thanks</li>' +
  886. '<li title="Trap setup for winter season (hydro)"><span class="paramDesc">Winter</span>' + generateTrapSetupCombo('Winter') + '</li>' +
  887. '<li title="Trap setup for spring season (physical)"><span class="paramDesc">Spring</span>' + generateTrapSetupCombo('Spring') + '</li>' +
  888. '<li title="Trap setup for summer season (tactical)"><span class="paramDesc">Summer</span>' + generateTrapSetupCombo('Summer') + '</li>' +
  889. '<li title="Trap setup for fall season (shadow)"><span class="paramDesc">Fall</span>' + generateTrapSetupCombo('Fall') + '</li>' +
  890.  
  891. '</ul><ul><span class="groupTitle">Zugzwang Tower</span>' +
  892. '<li title="Side to determine phase"><span class="paramDesc">Side</span><input type="radio" name="optTarget" value="0" />Highest Progress <input type="radio" name="optTarget" value="1" />Technic <input type="radio" name="optTarget" value="2" />Mystic <input type="radio" name="optTarget" value="3" />Both Side</li>' +
  893. '<li title="Trap setup for pawn"><span class="paramDesc">Pawn</span>' + generateTrapSetupCombo('Pawn') + '</li>' +
  894. '<li title="Trap setup for knight"><span class="paramDesc">Knight</span>' + generateTrapSetupCombo('Knight') + '</li>' +
  895. '<li title="Trap setup for bishop"><span class="paramDesc">Bishop</span>' + generateTrapSetupCombo('Bishop') + '</li>' +
  896. '<li title="Trap setup for rook"><span class="paramDesc">Rook</span>' + generateTrapSetupCombo('Rook') + '</li>' +
  897. '<li title="Trap setup for queen"><span class="paramDesc">Queen</span>' + generateTrapSetupCombo('Queen') + '</li>' +
  898. '<li title="Trap setup for king"><span class="paramDesc">King</span>' + generateTrapSetupCombo('King') + '</li>' +
  899. '<li title="Trap setup for chessmaster"><span class="paramDesc">Chessmaster</span>' + generateTrapSetupCombo('Chessmaster') + '</li>' +
  900. '</ul><br>');
  901. $('div#AutoHornWindow div[name="main"]').css({'overflow-y':'auto', 'height':'350px'});
  902. $('div#AutoHornWindow div[name="main"] ul').css({'list-style-type':'none','margin':'0px'});
  903. $('div#AutoHornWindow div[name="main"] .groupTitle').css({'font-weight':'bold','font-size':'1.2em'});
  904. $('div#AutoHornWindow div[name="main"] .paramDesc').css({'font-weight':'bold','float':'left','width':'150', 'padding-left':'20px'});
  905. $('div#AutoHornWindow div[name="main"] select').css({'width':'300px'});
  906. $('div#AutoHornWindow div[name="main"] br').css({'clear':'left'});
  907. populateComboTrap(availableTraps);
  908.  
  909. $('div#AutoHornWindow div[name="main"] select').css({'width':'100px'});
  910. // set selected values
  911. if (trapConfig.ZugzwangTower.enabled) $('div#AutoHornWindow input[name="chkEnable"]').attr('checked', 'checked');
  912. if (trapConfig.SeasonalGarden.autoTravel) $('div#AutoHornWindow input[name="autoTravel"][value="true"]').attr('checked', 'checked');
  913. else $('div#AutoHornWindow input[name="autoTravel"][value="false"]').attr('checked', 'checked');
  914. $('div#AutoHornWindow input[name="optTarget"][value="' + trapConfig.ZugzwangTower.target + '"]').attr('checked', 'checked');
  915. setSelectionComboTrap('Winter', trapConfig.SeasonalGarden.wr);
  916. setSelectionComboTrap('Spring', trapConfig.SeasonalGarden.sg);
  917. setSelectionComboTrap('Summer', trapConfig.SeasonalGarden.sr);
  918. setSelectionComboTrap('Fall', trapConfig.SeasonalGarden.fl);
  919. setSelectionComboTrap('Pawn', trapConfig.ZugzwangTower.pawn);
  920. setSelectionComboTrap('Knight', trapConfig.ZugzwangTower.knight);
  921. setSelectionComboTrap('Bishop', trapConfig.ZugzwangTower.bishop);
  922. setSelectionComboTrap('Rook', trapConfig.ZugzwangTower.rook);
  923. setSelectionComboTrap('Queen', trapConfig.ZugzwangTower.queen);
  924. setSelectionComboTrap('King', trapConfig.ZugzwangTower.king);
  925. setSelectionComboTrap('Chessmaster', trapConfig.ZugzwangTower.chessmaster);
  926.  
  927. $('div#AutoHornWindow a[href="#save"]').click(function(e){
  928. e.preventDefault();
  929. trapConfig.ZugzwangTower.enabled = $('div#AutoHornWindow input[name="chkEnable"]:checked').length;
  930. if ($('div#AutoHornWindow input[name="autoTravel"]:checked').val() == 'true') trapConfig.SeasonalGarden.autoTravel = true;
  931. else trapConfig.SeasonalGarden.autoTravel = false;
  932. trapConfig.ZugzwangTower.target = parseInt($('div#AutoHornWindow input[name="optTarget"]:checked').val());
  933. getSelectionComboTrap('Winter', trapConfig.SeasonalGarden.wr);
  934. getSelectionComboTrap('Spring', trapConfig.SeasonalGarden.sg);
  935. getSelectionComboTrap('Summer', trapConfig.SeasonalGarden.sr);
  936. getSelectionComboTrap('Fall', trapConfig.SeasonalGarden.fl);
  937. getSelectionComboTrap('Pawn', trapConfig.ZugzwangTower.pawn);
  938. getSelectionComboTrap('Knight', trapConfig.ZugzwangTower.knight);
  939. getSelectionComboTrap('Bishop', trapConfig.ZugzwangTower.bishop);
  940. getSelectionComboTrap('Rook', trapConfig.ZugzwangTower.rook);
  941. getSelectionComboTrap('Queen', trapConfig.ZugzwangTower.queen);
  942. getSelectionComboTrap('King', trapConfig.ZugzwangTower.king);
  943. getSelectionComboTrap('Chessmaster', trapConfig.ZugzwangTower.chessmaster);
  944. var str = JSON.stringify(trapConfig);
  945. saveParam('trapConfig', str);
  946.  
  947. $('div#AutoHornWindow').hide();
  948. $('div#AutoHornMask').hide();
  949. checkLocation();
  950. });
  951. $('div#AutoHornWindow a[href="#default"]').click(function(e){
  952. e.preventDefault();
  953. $('div#AutoHornWindow input[name="chkEnable"]').removeAttr('checked');
  954. $('div#AutoHornWindow input[name="autoTravel"][value="false"]').attr('checked', 'checked');
  955. $('div#AutoHornWindow input[name="optTarget"][value="0"]').attr('checked', 'checked');
  956. $('div#AutoHornWindow select[name^="cbo"] option').each(function(){ $(this).removeAttr('selected'); });
  957. });
  958. var winH = $(window).height();
  959. var winW = $(window).width();
  960. $('div#AutoHornWindow').css({'top':(winH - $('div#AutoHornWindow').height())/2, 'left':(winW - $('div#AutoHornWindow').width())/2});
  961. $('div#AutoHornMask').css({'top':'0', 'left':'0', 'width':winW, 'height':winH});
  962. $('div#AutoHornMask').fadeTo(0,0.8);
  963. $('div#AutoHornWindow').fadeIn(2000);
  964. }
  965.  
  966. function showConfigPage(){
  967. $('div#AutoHornWindow a[href="#save"]').unbind('click');
  968. $('div#AutoHornWindow a[href="#default"]').unbind('click');
  969. $('div#AutoHornWindow div[name="top"]').html('AutoHorn Configuration');
  970. $('div#AutoHornWindow div[name="main"]').html('<ul><span class="groupTitle">General</span><li title="extra time to be added to horn time"><span class="paramDesc">Horn Delay</span>min <input type="text" name="txtMinHorn" class="short" /> max <input type="text" name="txtMaxHorn" class="short" /> seconds</li><li title="time to opening random link"><span class="paramDesc">Random Delay</span>min <input type="text" name="txtMinRandom" class="short" /> max <input type="text" name="txtMaxRandom" class="short" /> minutes</li><li title="When to checking page for TrapCheck (mm:ss). This will using your local time."><span class="paramDesc">Trap Check</span><input type="radio" name="optTrapCheck" value="true" />Enable at <input type="text" name="txtTrapCheckMin" class="short" /> : <input type="text" name="txtTrapCheckSec" class="short" /><input type="radio" name="optTrapCheck" value="false" />Disable</li><li title="time to wait when king\'s reward appears before opening random link"><span class="paramDesc">KR Delay</span>min <input type="text" name="txtMinKR" class="short" /> max <input type="text" name="txtMaxKR" class="short" /> minutes</li><li title="toggle update timer on window title"><span class="paramDesc">Update Window Title</span><input type="radio" name="optWinTitle" value="true" />Yes <input type="radio" name="optWinTitle" value="false" />No</li></ul><ul><span class="groupTitle">Sound</span><li title="use sound as king\'s reward alert"><span class="paramDesc">Alert Sound</span><input type="radio" name="optAlert" value="true" />Yes <input type="radio" name="optAlert" value="false" />No <input type="button" name="testSound" value="Test" /></li><li title="volume for alert"><span class="paramDesc">Sound Volume</span><input type="text" name="txtVolume" class="short" /></li></ul><br />');
  971. $('div#AutoHornWindow div[name="main"]').css({'overflow-y':'auto', 'height':'350px'});
  972. $('div#AutoHornWindow div[name="main"] ul').css({'list-style-type':'none','margin':'0px'});
  973. $('div#AutoHornWindow div[name="main"] .groupTitle').css({'font-weight':'bold','font-size':'1.2em'});
  974. $('div#AutoHornWindow div[name="main"] .paramDesc').css({'font-weight':'bold','float':'left','width':'150', 'padding-left':'20px'});
  975. $('div#AutoHornWindow div[name="main"] input.short').css({'width':'30px','text-align':'right'});
  976. $('div#AutoHornWindow div[name="main"] input.long').css({'width':'150px'});
  977. $('div#AutoHornWindow div[name="main"] br').css({'clear':'left'});
  978. $('div#AutoHornWindow div[name="main"] input[name="txtMinHorn"]').val(loadParam('minHornDelay', 30));
  979. $('div#AutoHornWindow div[name="main"] input[name="txtMaxHorn"]').val(loadParam('maxHornDelay', 120));
  980. $('div#AutoHornWindow div[name="main"] input[name="txtMinKR"]').val(loadParam('minKRWait', 180));
  981. $('div#AutoHornWindow div[name="main"] input[name="txtMaxKR"]').val(loadParam('maxKRWait', 210));
  982. $('div#AutoHornWindow div[name="main"] input[name="txtMinRandom"]').val(loadParam('minRandomPage', 10));
  983. $('div#AutoHornWindow div[name="main"] input[name="txtMaxRandom"]').val(loadParam('maxRandomPage', 20));
  984. $('div#AutoHornWindow div[name="main"] input[name="txtTrapCheckMin"]').val(trapConfig.TrapCheck.min);
  985. $('div#AutoHornWindow div[name="main"] input[name="txtTrapCheckSec"]').val(trapConfig.TrapCheck.sec);
  986. $('div#AutoHornWindow div[name="main"] input[name="txtVolume"]').val(loadParam('alertVolume', 100));
  987. if (loadParam('enableAlert', false)) $('div#AutoHornWindow div[name="main"] input[name="optAlert"][value="true"]').prop("checked", true);
  988. else $('div#AutoHornWindow div[name="main"] input[name="optAlert"][value="false"]').prop("checked", true);
  989. if (loadParam('updateWindowTitle', true)) $('div#AutoHornWindow div[name="main"] input[name="optWinTitle"][value="true"]').prop("checked", true);
  990. else $('div#AutoHornWindow div[name="main"] input[name="optWinTitle"][value="false"]').prop("checked", true);
  991. if (trapConfig.TrapCheck.enable) $('div#AutoHornWindow div[name="main"] input[name="optTrapCheck"][value="true"]').prop("checked", true);
  992. else $('div#AutoHornWindow div[name="main"] input[name="optTrapCheck"][value="false"]').prop("checked", true);
  993. $('div#AutoHornWindow div[name="main"] input[name="testSound"]').click(function(){
  994. if ($(this).val() == 'Test'){
  995. soundAlarm();
  996. $(this).val('Stop');
  997. } else {
  998. $('span#alarm').remove();
  999. $(this).val('Test');
  1000. }
  1001. });
  1002.  
  1003. $('div#AutoHornWindow a[href="#save"]').click(function(e){
  1004. e.preventDefault();
  1005. saveParam('minHornDelay', parseInt($('div#AutoHornWindow div[name="main"] input[name="txtMinHorn"]').val()));
  1006. saveParam('maxHornDelay', parseInt($('div#AutoHornWindow div[name="main"] input[name="txtMaxHorn"]').val()));
  1007. saveParam('minKRWait', parseInt($('div#AutoHornWindow div[name="main"] input[name="txtMinKR"]').val()));
  1008. saveParam('maxKRWait', parseInt($('div#AutoHornWindow div[name="main"] input[name="txtMaxKR"]').val()));
  1009. saveParam('alertVolume', parseInt($('div#AutoHornWindow div[name="main"] input[name="txtVolume"]').val()));
  1010. saveParam('minRandomPage', parseInt($('div#AutoHornWindow div[name="main"] input[name="txtMinRandom"]').val()));
  1011. saveParam('maxRandomPage', parseInt($('div#AutoHornWindow div[name="main"] input[name="txtMaxRandom"]').val()));
  1012. saveParam('enableAlert', $('div#AutoHornWindow div[name="main"] input[name="optAlert"]:checked').val()=="true" ? true : false);
  1013. saveParam('updateWindowTitle', $('div#AutoHornWindow div[name="main"] input[name="optWinTitle"]:checked').val()=="true" ? true : false);
  1014. trapConfig.TrapCheck.enable = ($('div#AutoHornWindow div[name="main"] input[name="optTrapCheck"]:checked').val()=="true" ? true : false);
  1015. trapConfig.TrapCheck.min = parseInt($('div#AutoHornWindow div[name="main"] input[name="txtTrapCheckMin"]').val());
  1016. trapConfig.TrapCheck.sec = parseInt($('div#AutoHornWindow div[name="main"] input[name="txtTrapCheckSec"]').val());
  1017. var str = JSON.stringify(trapConfig);
  1018. saveParam('trapConfig', str);
  1019. calculateTrapCheck();
  1020. $('div#AutoHornWindow').hide();
  1021. $('div#AutoHornMask').hide();
  1022. });
  1023. $('div#AutoHornWindow a[href="#default"]').click(function(e){
  1024. e.preventDefault();
  1025. $('div#AutoHornWindow div[name="main"] input[name="txtMinHorn"]').val(30);
  1026. $('div#AutoHornWindow div[name="main"] input[name="txtMaxHorn"]').val(120);
  1027. $('div#AutoHornWindow div[name="main"] input[name="txtMinKR"]').val(180);
  1028. $('div#AutoHornWindow div[name="main"] input[name="txtMaxKR"]').val(210);
  1029. $('div#AutoHornWindow div[name="main"] input[name="txtMinRandom"]').val(10);
  1030. $('div#AutoHornWindow div[name="main"] input[name="txtMaxRandom"]').val(20);
  1031. $('div#AutoHornWindow div[name="main"] input[name="txtTrapCheckMin"]').val(0);
  1032. $('div#AutoHornWindow div[name="main"] input[name="txtTrapCheckSec"]').val(0);
  1033. $('div#AutoHornWindow div[name="main"] input[name="txtVolume"]').val(100);
  1034. $('div#AutoHornWindow div[name="main"] input[name="optAlert"][value="false"]').prop("checked", true);
  1035. $('div#AutoHornWindow div[name="main"] input[name="optWinTitle"][value="true"]').prop("checked", true);
  1036. $('div#AutoHornWindow div[name="main"] input[name="optTrapCheck"][value="false"]').prop("checked", true);
  1037. });
  1038. var winH = $(window).height();
  1039. var winW = $(window).width();
  1040. $('div#AutoHornWindow').css({'top':(winH - $('div#AutoHornWindow').height())/2, 'left':(winW - $('div#AutoHornWindow').width())/2});
  1041. $('div#AutoHornMask').css({'top':'0', 'left':'0', 'width':winW, 'height':winH});
  1042. $('div#AutoHornMask').fadeTo(0,0.8);
  1043. $('div#AutoHornWindow').fadeIn(2000);
  1044. }
  1045.  
  1046. function cleanupLink(){
  1047. $("a[href*='apps.facebook.com/mousehunt/profile.php']").add("a[href*='apps.facebook.com/mousehunt/adversaries.php?']").add("a[href*='apps.facebook.com/mousehunt/item.php']").add("a[href*='apps.facebook.com/mousehunt/inventory.php']").each(function(i){
  1048. var link = $(this).attr('href');
  1049. link = link.replace('apps.facebook.com/mousehunt/', 'www.mousehuntgame.com/');
  1050. $(this).attr('href', link);
  1051. });
  1052. $("a[href^='https:\/\/www.mousehuntgame.com']").each(function() {
  1053. var link = $(this).attr('href');
  1054. link = link.replace('https:\/\/', 'http://');
  1055. $(this).attr('href', link);
  1056. });
  1057. $("img[src^='https:\/\/www.mousehuntgame.com\/images\/']").each(function() {
  1058. var link = $(this).attr('src');
  1059. link = link.replace('https:\/\/', 'http://');
  1060. $(this).attr('src', link);
  1061. });
  1062. }
  1063.  
  1064. function saveParam(name, val){
  1065. if (typeof unsafeWindow.user == "undefined") return;
  1066. GM_setValue(unsafeWindow.user.user_id + ':' + name, val);
  1067. }
  1068.  
  1069. function loadParam(name, def){
  1070. if (typeof unsafeWindow.user == "undefined" || typeof GM_getValue=="undefined") return def;
  1071. return GM_getValue(unsafeWindow.user.user_id + ':' + name, def);
  1072. }
  1073.  
  1074. function updateAvailableTraps(newTrap){
  1075. var tmp = {};
  1076. for (var x in newTrap){
  1077. if (newTrap[x].is_hidden) continue;
  1078. tmp[newTrap[x].type] = {
  1079. item_id : newTrap[x].item_id,
  1080. name : newTrap[x].name,
  1081. classification : newTrap[x].classification,
  1082. quantity : newTrap[x].quantity
  1083. };
  1084. if (newTrap[x].power_type_name) tmp[newTrap[x].type].power_type_name = newTrap[x].power_type_name;
  1085. }
  1086. availableTraps = tmp;
  1087. saveParam('availableTraps', JSON.stringify(availableTraps));
  1088. }
  1089.  
  1090. function updateAvailableQuantity(newTrap){
  1091. var tmp = {};
  1092. for (var x in newTrap){
  1093. if (newTrap[x].classification != 'bait' && newTrap[x].classification != 'trinket' && newTrap[x].classification != 'weapon' && newTrap[x].classification != 'base') continue;
  1094. if (newTrap[x].is_hidden) continue;
  1095. tmp[newTrap[x].type] = {
  1096. item_id : newTrap[x].item_id,
  1097. name : newTrap[x].name,
  1098. classification : newTrap[x].classification,
  1099. quantity : newTrap[x].quantity
  1100. };
  1101. if (newTrap[x].power_type_name) tmp[newTrap[x].type].power_type_name = newTrap[x].power_type_name;
  1102. }
  1103. jQuery.extend(true, availableTraps, tmp);
  1104. saveParam('availableTraps', JSON.stringify(availableTraps));
  1105. }
  1106.  
  1107. function ajaxRequestEffMeter(todo) {
  1108. if (unsafeWindow.user.has_puzzle==true || currentTrap.busy) return;
  1109. if (currentTrap.effmeter) { if (todo != undefined) todo(); return; }
  1110. if (currentTrap.busy) setTimeout(ajaxRequestEffMeter(todo), 5000);
  1111. currentTrap.busy = true;
  1112. var ajax=new unsafeWindow.Ajax();
  1113. ajax.requireLogin=true;
  1114. ajax.responseType=unsafeWindow.Ajax.JSON;
  1115. ajax.ondone = function(resp){
  1116. currentTrap.busy = false;
  1117. currentTrap.effmeter = resp.effectiveness;
  1118. if (todo != undefined) todo();
  1119. }
  1120. var params={'uh':unsafeWindow.user.unique_hash};
  1121. ajax.post(unsafeWindow.callbackurl+"managers/ajax/users/getmiceeffectiveness.php",params);
  1122. }
  1123.  
  1124. function ajaxRequestAvailableTraps(){
  1125. if (unsafeWindow.user.has_puzzle==true) return;
  1126. var ajax=new unsafeWindow.Ajax();
  1127. ajax.requireLogin=true;
  1128. ajax.responseType=unsafeWindow.Ajax.JSON;
  1129. var params={'uh':unsafeWindow.user.unique_hash};
  1130. ajax.post(unsafeWindow.callbackurl+"managers/ajax/users/gettrapcomponents.php",params);
  1131. }
  1132.  
  1133. function loadInitialParameters(){
  1134. if (typeof unsafeWindow.user == "undefined") { setTimeout(function() { loadInitialParameters(); }, 500); return; }
  1135. if (loadParam('trapConfig', null) == null) {
  1136. saveParam('trapConfig', JSON.stringify(trapConfig));
  1137. } else {
  1138. jQuery.extend(true, trapConfig, jQuery.parseJSON(loadParam('trapConfig', null)));
  1139. }
  1140. if (loadParam('availableTraps', null) == null) {
  1141. ajaxRequestAvailableTraps();
  1142. } else {
  1143. jQuery.extend(true, availableTraps, jQuery.parseJSON(loadParam('availableTraps', null)));
  1144. }
  1145. }
  1146.  
  1147. function endsWith(str, suffix) {
  1148. return str.indexOf(suffix, str.length - suffix.length) !== -1;
  1149. }
  1150.  
  1151. $(document).ready(function(){
  1152. cleanupLink();
  1153. if ($('a[href$="turn.php"]').length < 1 && $('div#mobilePuzzle').length < 1){
  1154. setTimeout(function() { document.location = defaultpage; } , 3*60*1000);
  1155. return;
  1156. } else {
  1157. loadInitialParameters();
  1158. setTimeout(function() { mulai(); } , 1000);
  1159. }
  1160. if ($('div#header div.headsup div.hudstatlist').length > 2) {
  1161. $('div#header div.headsup div.hudstatlist:last li:last').before('<li><span class="hudstatlabel">Charm:</span>&nbsp;<span id="hud_trinketName"><a href="http://www.mousehuntgame.com/inventory.php?tab=1">None&nbsp;</a></span><span id="hud_trinketQuantityLabel">(<span id="hud_trinketQuantity">0</span>)</span></li>');
  1162. }
  1163.  
  1164. $('div.hgSideBar').prepend('<div id="AutoHorn"><ul><li><a href="#conf">AutoHorn Setting</a></li><li>Horn Timer<span name="hornTime">00:00</span></li><li>Random Timer<span name="randomTime">00:00</span></li><li>Trap Check<span name="trapCheckTime">00:00</span></li></ul></div>');
  1165. $('div#AutoHorn').append('<br><ul id="seqConfig">Defined Trap Setup');
  1166. $('div#AutoHorn').append('<li><a href="#balack">Balack\'s Cove</a></li>');
  1167. $('div#AutoHorn a[href="#balack"]').click(function(e){
  1168. e.preventDefault();
  1169. showBalackPage();
  1170. });
  1171. $('div#AutoHorn').append('<li><a href="#zugzwang">Seasonal Garden - Zugzwang</a></li>');
  1172. $('div#AutoHorn a[href="#zugzwang"]').click(function(e){
  1173. e.preventDefault();
  1174. showZugzwangPage();
  1175. });
  1176. $('div#AutoHorn').append('<li><a href="#iceberg">Slushy - Iceberg</a></li>');
  1177. $('div#AutoHorn a[href="#iceberg"]').click(function(e){
  1178. e.preventDefault();
  1179. showIcebergPage();
  1180. });
  1181. $('div#AutoHorn').append('<li><a href="#warpath">Fiery Warpath</a></li>');
  1182. $('div#AutoHorn a[href="#warpath"]').click(function(e){
  1183. e.preventDefault();
  1184. showWarpathPage();
  1185. });
  1186. $('div#AutoHorn').append('</ul><br>');
  1187. $('div#hgAppContainer').append('<div id="AutoHornWindow"><div name="top"></div><div name="main"></div><div name="bottom" style="position:absolute;bottom:10px;right:10px;"><a href="#save">Save</a> | <a href="#default">Restore Default</a> | <a href="#close">Close</a></div></div>');
  1188. $('div#hgAppContainer').append('<div id="AutoHornMask"></div>');
  1189. $('div#AutoHornWindow').css({'background-color':'#ffffff', 'position':'fixed', 'width':'600px', 'height':'400px', 'display':'none', 'z-index':'9999', 'padding':'20px'});
  1190. $('div#AutoHornMask').css({'background-color':'#000', 'position':'fixed', 'display':'none', 'z-index':'9998', 'padding':'0px'});
  1191. $(window).resize(function() {
  1192. var winH = $(window).height();
  1193. var winW = $(window).width();
  1194. $('div#AutoHornWindow').css({'top':(winH - $('div#AutoHornWindow').height())/2, 'left':(winW - $('div#AutoHornWindow').width())/2});
  1195. $('div#AutoHornMask').css({'top':'0', 'left':'0', 'width':winW, 'height':winH});
  1196. });
  1197. $('div#AutoHornWindow div[name="top"]').css({'font-weight':'bold','font-size':'18','text-align':'center','padding-bottom':'10px'});
  1198. $('div#AutoHorn').css({'padding-bottom':'20px', 'margin-bottom':'20px', 'border-bottom':'2px solid black'});
  1199. $('div#AutoHorn br').css({'clear':'right'});
  1200. $('div#AutoHorn li span').css({'float':'right'});
  1201. $('div#AutoHorn a[href="#conf"]').click(function(e){
  1202. e.preventDefault();
  1203. showConfigPage();
  1204. });
  1205. $('div#AutoHornWindow a[href="#close"]').click(function(e){
  1206. e.preventDefault();
  1207. $('div#AutoHornWindow').hide();
  1208. $('div#AutoHornMask').hide();
  1209. });
  1210. unsafeWindow.$(document).ajaxSuccess(function(e, xhr, opt) {
  1211. var obj = jQuery.parseJSON(xhr.responseText);
  1212. if (obj.components) setTimeout(function() { updateAvailableTraps(obj.components); }, 1);
  1213. else if (obj.inventory) setTimeout(function() { updateAvailableQuantity(obj.inventory); }, 1);
  1214. if (obj.user.has_puzzle && !alertShown) {
  1215. alertShown = true;
  1216. setTimeout(function() {
  1217. if (GM_getValue(obj.user.user_id + ':enableAlert', false)) soundAlarm(); else alert('King Reward');
  1218. }, 1);
  1219. }
  1220. if (endsWith(opt.url, 'activeturn.php')) {
  1221. currentTrap.effmeter = null;
  1222. }
  1223. if (obj.user.user_id) {
  1224. if (!obj.user.has_puzzle && alertShown) {
  1225. $('span#alarm').remove();
  1226. alertShown = false;
  1227. }
  1228. setTimeout(function() { mulai(); }, 1000);
  1229. }
  1230. });
  1231. calculateRandomPage();
  1232. tulisWaktu();
  1233. });