AutoDfkoc

dark forest test

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.gf.qytechs.cn/scripts/534144/1578659/AutoDfkoc.js

  1. /*************** AUTODF Tab **********/
  2. // @tabversion 20171109
  3. Tabs.Barb = {
  4. tabLabel: unsafeWindow.g_js_strings.commonstr.darkForest,
  5. tabOrder: 8000,
  6. tabColor : 'brown',
  7. myDiv : null,
  8. MapAjax : new CMapAjax(),
  9. BlockList : [],
  10. Blocks : [],
  11. popFirst : true,
  12. opt : {},
  13. nextattack : null,
  14. searchRunning : false,
  15. tilesSearched : 0,
  16. tilesFound : 0,
  17. curX : 0,
  18. curY : 0,
  19. lastX : 0,
  20. firstX : 0,
  21. firstY : 0,
  22. lastY : 0,
  23. rallypointlevel:0,
  24. knt:{},
  25. barbArray:{},
  26. lookup:1,
  27. city:1,
  28. deleting:false,
  29. maplag:0,
  30. troopDef : [],
  31. Options: {
  32. dfbtns:false,
  33. Method : "distance",
  34. SendInterval : 8,
  35. MaxDistance : 20,
  36. RallyClip : 0,
  37. Running : false,
  38. BarbsFailedKnight : 0,
  39. BarbsFailedRP : 0,
  40. BarbsFailedTraffic : 0,
  41. BarbsFailedVaria : 0,
  42. BarbsFailedBog : 0,
  43. BarbsTried : 0,
  44. DeleteMsg : true,
  45. DeleteMsgs0 : false,
  46. Foodstatus : {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0},
  47. AetherStatus : {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0},
  48. MsgLevel : {1:true,2:true,3:true,4:true,5:true,6:true,7:true,8:true,9:true,10:true,11:true,12:true,13:true,14:true,15:true},
  49. BarbsDone : {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0},
  50. BarbNumber : {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0},
  51. Levels : {1:{0:false,1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false,9:false,10:false,11:false,12:false,13:false,14:false,15:false},2:{0:false,1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false,9:false,10:false,11:false,12:false,13:false,14:false,15:false},3:{0:false,1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false,9:false,10:false,11:false,12:false,13:false,14:false,15:false},4:{0:false,1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false,9:false,10:false,11:false,12:false,13:false,14:false,15:false},5:{0:false,1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false,9:false,10:false,11:false,12:false,13:false,14:false,15:false},6:{0:false,1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false,9:false,10:false,11:false,12:false,13:false,14:false,15:false},7:{0:false,1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false,9:false,10:false,11:false,12:false,13:false,14:false,15:false},8:{0:false,1:false,2:false,3:false,4:false,5:false,6:false,7:false,8:false,9:false,10:false,11:false,12:false,13:false,14:false,15:false}},
  52. Troops : {1:{1:0,2:0,3:0,4:0,5:0,6:0,7:0, 8:0,9:0, 10:0, 11:0, 12:0},2:{1:0,2:0,3:0,4:0,5:0,6:0,7:0, 8:0,9:0, 10:0, 11:0, 12:0},3:{1:0,2:0,3:0,4:0,5:0,6:0,7:0, 8:0,9:0, 10:0, 11:0, 12:0},4:{1:0,2:0,3:0,4:0,5:0,6:0,7:0, 8:0,9:0, 10:0, 11:0, 12:0},5:{1:0,2:0,3:0,4:0,5:0,6:0,7:0, 8:0,9:0, 10:0, 11:0, 12:0},6:{1:0,2:0,3:0,4:0,5:0,6:0,7:0, 8:0,9:0, 10:0, 11:0, 12:0},7:{1:0,2:0,3:0,4:0,5:0,6:0,7:0, 8:0,9:0, 10:0, 11:0, 12:0},8:{1:0,2:0,3:0,4:0,5:0,6:0,7:0, 8:0,9:0, 10:0, 11:0, 12:0},9:{1:0,2:0,3:0,4:0,5:0,6:0,7:0, 8:0,9:0, 10:0, 11:0, 12:0},10:{1:0,2:0,3:0,4:0,5:0,6:0,7:0, 8:0,9:0, 10:0, 11:0, 12:0},11:{1:0,2:0,3:0,4:0,5:0,6:0,7:0, 8:0,9:0, 10:0, 11:0, 12:0},12:{1:0,2:0,3:0,4:0,5:0,6:0,7:0, 8:0,9:0, 10:0, 11:0, 12:0},13:{1:0,2:0,3:0,4:0,5:0,6:0,7:0, 8:0,9:0, 10:0, 11:0, 12:0},14:{1:0,2:0,3:0,4:0,5:0,6:0,7:0, 8:0,9:0, 10:0, 11:0, 12:0},15:{1:0,2:0,3:0,4:0,5:0,6:0,7:0, 8:0,9:0, 10:0, 11:0, 12:0}},
  53. MinDistance : {1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0,10:0,11:0,12:0,13:0,14:0,15:0},
  54. Distance : {1:750,2:750,3:750,4:750,5:750,6:750,7:750,8:750,9:750,10:750,11:750,12:750,13:750,14:750,15:750},
  55. Update : {1:[0,0],2:[0,0],3:[0,0],4:[0,0],5:[0,0],6:[0,0],7:[0,0],8:[0,0]},
  56. UpdateEnabled : true,
  57. UpdateInterval : 30,
  58. stopsearch : 1,
  59. knightselector : 0,
  60. barbMinKnight : 50,
  61. barbMaxKnight : 300,
  62. threshold : 750000,
  63. },
  64. init : function (div){
  65. var t = Tabs.Barb;
  66. if (!Options.DFOptions) {
  67. Options.DFOptions = t.Options;
  68. }
  69. else {
  70. for (var y in t.Options) {
  71. if (!Options.DFOptions.hasOwnProperty(y)) {
  72. Options.DFOptions[y] = t.Options[y];
  73. }
  74. }
  75. }
  76. if(Options.DFOptions.dfbtns)AddSubTabLink(unsafeWindow.g_js_strings.commonstr.darkForest,t.toggleBarbState, 'DFToggleTab');
  77. t.myDiv = div;
  78. for (var ui in unsafeWindow.cm.UNIT_TYPES){
  79. var i = unsafeWindow.cm.UNIT_TYPES[ui];
  80. var trp = [];
  81. trp.push(unsafeWindow.unitcost['unt'+i][0]);
  82. trp.push(i);
  83. t.troopDef.push(trp);
  84. }
  85. var m = '<DIV id=pbTowrtDivF class=divHeader align=center>AUTOMATED FOREST FUNCTION</div><TABLE id=pbbarbingfunctions width=100% height=0% class=pbTab><TR align="center">';
  86. if (Options.DFOptions.Running == false) {
  87. m += '<TD><INPUT id=AttSearch type=submit value="Attack = OFF"></td>';
  88. if(document.getElementById('DFToggleTab'))document.getElementById('DFToggleTab').innerHTML = '<span style="color: #CCC">'+unsafeWindow.g_js_strings.commonstr.darkForest+': Off</span>';
  89. } else {
  90. m += '<TD><INPUT id=AttSearch type=submit value="Attack = ON"></td>';
  91. if(document.getElementById('DFToggleTab'))document.getElementById('DFToggleTab').innerHTML = '<span style="color: #FFFF00">'+unsafeWindow.g_js_strings.commonstr.darkForest+': On</span>';
  92. }
  93. m += '<TD><INPUT id=troopselect type=submit value="Select troops"></td>';
  94. m += '<TD><INPUT id=Options type=submit value="Options"></td>';
  95. m += '<TD><INPUT id=StopSearch type=submit value="Stop Current Search"></td>';
  96. m += '</tr></table></div>';
  97. m += '<DIV id=pbTraderDivD class=divHeader align=center>FOREST STATS</div>';
  98. m += '<TABLE id=pbbarbstats width=95% height=0% class=pbTab><TR align="left"><TR>';
  99. for(i=0;i<Seed.cities.length;i++){
  100. m += '<TD>' + Seed.cities[i][1] +'</td>';
  101. }
  102. m+='</tr><TR>';
  103. for(i=0;i<Seed.cities.length;i++){
  104. m += '<TD><DIV><span id='+ 'pdtotalcity' + i +'></span></div></td>';
  105. }
  106. m+='</tr><TR>';
  107. for(i=0;i<Seed.cities.length;i++){
  108. m += '<TD><DIV><span id='+ 'pddatacity' + i +'></span></div></td>';
  109. }
  110. m+='</tr><TR>'
  111. for(i=0;i<Seed.cities.length;i++){
  112. m += '<TD><DIV><span id='+ 'pddataarray' + i +'></span></div></td>';
  113. }
  114. m+='</tr></table><TABLE id=pbbarbstats width=95% height=0% class=pbTab><TR align="left"><TR>';
  115. for (i=0;i<=6;i++) {
  116. m+='<TD><DIV><span id='+ 'pberror' + i +'></span></div></td>';
  117. }
  118. m+='</tr></table>';
  119. m+='<div id="dferrorlog">&nbsp;</div>';
  120. m += '<DIV id=pbTraderDivD class=divHeader align=center>FOREST OPTIONS</div>';
  121. m += '<TABLE width=95% height=0% class=ptTab><TR align="left">';
  122. for(i=0;i<Seed.cities.length;i++){
  123. m += '<TR><TD>' + Seed.cities[i][1] +'</td>';
  124. for (w=1;w<=15;w++){
  125. m += '<TD class=pblevelopt><INPUT id=pbcity'+i+'level'+w+' type=checkbox unchecked=true>Lvl:'+w+'</td>';
  126. }
  127. }
  128. m+='</table><br>'
  129. t.myDiv.innerHTML = m;
  130.  
  131. saveOptions();
  132. t.checkBarbData();
  133.  
  134. for(i=0;i<Seed.cities.length;i++){
  135. var element = 'pdtotalcity'+i;
  136. if (t.barbArray[i+1] == undefined) document.getElementById(element).innerHTML = 'No Data';
  137. else document.getElementById(element).innerHTML = 'Forests:' + t.barbArray[i+1].length;
  138. }
  139. for(i=0;i<Seed.cities.length;i++){
  140. for (w=1;w<=15;w++){
  141. document.getElementById('pbcity'+i+'level'+w).checked = Options.DFOptions.Levels[i+1][w];
  142. }
  143. }
  144. document.getElementById('AttSearch').addEventListener('click', function(){t.toggleBarbState(this)} , false);
  145. document.getElementById('Options').addEventListener('click', t.barbOptions , false);
  146. document.getElementById('StopSearch').addEventListener('click', t.callStop , false);
  147. document.getElementById('troopselect').addEventListener('click', t.troopOptions , false);
  148. var element_class = document.getElementsByClassName('pblevelopt');
  149. for (k=0;k<element_class.length;k++){
  150. element_class[k].addEventListener('click', t.saveLevelOptions , false);
  151. }
  152. },
  153. saveLevelOptions : function(){
  154. for(i=0;i<Seed.cities.length;i++){
  155. Options.DFOptions.Levels[i+1][0]=false;
  156. for (w=1;w<=15;w++){
  157. var ele = document.getElementById('pbcity'+i+'level'+w);
  158. Options.DFOptions.Levels[i+1][w]=ele.checked;
  159. if (ele.checked)
  160. Options.DFOptions.Levels[i+1][0]=true;
  161. }
  162. }
  163. saveOptions();
  164. },
  165. troopOptions: function(){
  166. var t = Tabs.Barb;
  167. var troopDef = t.troopDef;
  168. if(t.troopselect == null)
  169. t.troopselect = new CPopup ('pbtroopselect', 0, 0, 980, 650, true, function(){t.saveTroops();});
  170. t.troopselect.centerMe (mainPop.getMainDiv());
  171. var z= '<DIV id=pbTraderDivD class=divHeader align=center>TROOP SELECTION</div><TABLE width=100%><TR>';
  172. z+='<TD></td>';
  173. for(var j=0; j<15; j++)
  174. z+='<TD>Level '+(j+1)+'</td>';
  175. z+='</tr>';
  176.  
  177. for(i=0;i<troopDef.length;i++){
  178. z += '<TR><TD align=center><img src="'+IMGURL+'units/unit_'+troopDef[i][1]+'_30.jpg" title="'+troopDef[i][0]+'"></td>';
  179. for(var j=0; j<15; j++){
  180. if (!Options.DFOptions.Troops[j+1]) Options.DFOptions.Troops[j+1] = {};
  181. z += '<TD><INPUT id="level'+j+'troop'+i+'" type=text size=5 maxlength=6 value="'+(Options.DFOptions.Troops[j+1][i+1]?Options.DFOptions.Troops[j+1][i+1]:0)+'" /></td>';
  182. }
  183. z+='</tr>';
  184. }
  185.  
  186. z+='<TR><TD>MIN dist</td>';
  187. for(var j=0; j<15; j++){
  188. z+='<TD><INPUT id=Mindist'+j+' type=text size=3 maxlength=3 value="'+Options.DFOptions.MinDistance[j+1]+'"</td>';
  189. }
  190. z+='</tr>';
  191. z+='<TR><TD>MAX dist</td>';
  192. for(var j=0; j<15; j++){
  193. z+='<TD><INPUT id=dist'+j+' type=text size=3 maxlength=3 value="'+Options.DFOptions.Distance[j+1]+'"</td>';
  194. }
  195. z+='</tr>';
  196. z+='</table>';
  197. t.troopselect.getMainDiv().innerHTML = z;
  198. t.troopselect.show(true);
  199. },
  200. barbOptions: function(){
  201. var t = Tabs.Barb;
  202. if(t.barboptions == null)
  203. t.barboptions = new CPopup ('pbbarboptions', 0,0, 400,400, true);
  204. t.barboptions.centerMe (mainPop.getMainDiv());
  205. t.barboptions.getTopDiv().innerHTML = '<CENTER><b>Dark Forest Options for server '+getServerId()+'</b></CENTER>';
  206. var y = '<DIV style="max-height:400px; overflow-y:auto;"><DIV class=divHeader align=center>OPTIONS</div><TABLE width=100%>';
  207. y +='<TR><TD style="margin-top:5px; text-align:center;"><INPUT id=pbresetbarbs type=submit value="Reset Forests"></td>';
  208. y +='<TD style="margin-top:5px; text-align:center;"><INPUT id=pbpaintbarbs type=submit value="Show forests"></td>';
  209. y += '<TD><SELECT id=pbcity type=list></td></tr></table>';
  210. y +='<table width=100%><TD colspan=2 style="margin-top:5px; text-align:center;"><DIV class=pbStat> OPTIONS </div></td>';
  211. y +='<TR><TD>Attack interval: </td><td><INPUT id=pbsendint type=text size=4 maxlength=3 value='+ Options.DFOptions.SendInterval +' \> seconds</td></tr>';
  212. y +='<TR><TD>Max search distance: </td><td><INPUT id=pbmaxdist type=text size=4 maxlength=3 value='+ Options.DFOptions.MaxDistance +' \></td></tr>';
  213. y +='<TR><TD>Keep rallypoint slot(s) free: </td><Td><INPUT id=rallyclip type=text size=3 maxlength=2 value="'+Options.DFOptions.RallyClip+'" \> </td></tr>';
  214. y +='<TR><TD><INPUT id=pbreset type=checkbox '+(Options.DFOptions.UpdateEnabled?'CHECKED':'')+'\> Reset search every </td><td><INPUT id=pbresetint type=text size=4 maxlength=3 value='+Options.DFOptions.UpdateInterval+' \>minutes</td></tr>';
  215. y +='<TR><TD> Skip city search after </td><td><INPUT id=barbstopsearch type=text size=3 value='+Options.DFOptions.stopsearch+' \> tries.</td></tr>';
  216. y +='<TR><TD>Method : </td><Td> '+htmlSelector({distance:'Closest first', level:'Highest level first', lowlevel:'Lowest level first'}, Options.DFOptions.Method, 'id=pbmethod')+'</td></tr>';
  217. y +='<TR><TD>Knight priority : </td><td>'+htmlSelector({0:'Lowest combat skill', 1:'Highest combat skill'}, Options.DFOptions.knightselector, 'id=barbknight')+'</td></tr>';
  218. y +='<tr><td>Minimum knight Combat level to send: </td><td><input id=barbMinKnight type=text size=3 value='+Options.DFOptions.barbMinKnight+' \></td></tr>';
  219. y +='<tr><td>Maximum knight Combat level to send: </td><td><input id=barbMaxKnight type=text size=3 value='+Options.DFOptions.barbMaxKnight+' \></td></tr>';
  220. y +='<tr><td>Stop hitting Dark forests when Aetherstone in city is more than: </td><td><INPUT id=pbaothreshold type=text size=7 maxlength=8 value='+ Options.DFOptions.threshold +' \></td></tr>';
  221. y +='<tr><td>Add toggle button: </td><td><INPUT id=pbdftoggle type=checkbox '+(Options.DFOptions.dfbtns?'CHECKED':'')+' \></td></tr>';
  222. y+='</table></td></tr></table>';
  223. t.barboptions.getMainDiv().innerHTML = y;
  224. t.barboptions.show(true);
  225. document.getElementById('pbcity').options.length=0;
  226. for (i=0;i<Seed.cities.length;i++){
  227. var o = document.createElement("option");
  228. o.text = Seed.cities[i][1]
  229. o.value = i+1;
  230. document.getElementById("pbcity").options.add(o);
  231. }
  232. document.getElementById('pbdftoggle').addEventListener('click', function(){
  233. Options.DFOptions.dfbtns=document.getElementById('pbdftoggle').checked;
  234. saveOptions();
  235. },false);
  236. document.getElementById('pbpaintbarbs').addEventListener('click', function(){
  237. t.showBarbs(document.getElementById("pbcity").value,Seed.cities[document.getElementById("pbcity").value -1][1]);
  238. },false);
  239. document.getElementById('pbresetbarbs').addEventListener('click', t.deletebarbs,false);
  240. document.getElementById('pbmethod').addEventListener('change', function(){
  241. Options.DFOptions.Method=document.getElementById('pbmethod').value;
  242. saveOptions();
  243. t.checkBarbData();
  244. },false);
  245. document.getElementById('barbknight').addEventListener('change', function(){
  246. Options.DFOptions.knightselector=document.getElementById('barbknight').value;
  247. saveOptions();
  248. },false);
  249. document.getElementById('pbreset').addEventListener('change', function(){
  250. Options.DFOptions.UpdateEnabled=document.getElementById('pbreport').checked;
  251. saveOptions();
  252. },false);
  253. document.getElementById('pbresetint').addEventListener('change', function(){
  254. Options.DFOptions.UpdateInterval=parseInt(document.getElementById('pbresetint').value);
  255. saveOptions();
  256. },false);
  257. document.getElementById('pbsendint').addEventListener('change', function(){
  258. if(parseInt(document.getElementById('pbsendint').value) <5)
  259. document.getElementById('pbsendint').value = 5; //Set minimum attack interval to 5 seconds
  260. Options.DFOptions.SendInterval=parseInt(document.getElementById('pbsendint').value);
  261. saveOptions();
  262. },false);
  263. document.getElementById('pbmaxdist').addEventListener('change', function(){
  264. if(parseInt(document.getElementById('pbmaxdist').value) > 75)
  265. document.getElementById('pbmaxdist').value = 75;
  266. Options.DFOptions.MaxDistance=parseInt(document.getElementById('pbmaxdist').value);
  267. saveOptions();
  268. },false);
  269. document.getElementById('rallyclip').addEventListener('change', function(){
  270. Options.DFOptions.RallyClip=parseInt(document.getElementById('rallyclip').value);
  271. saveOptions();
  272. },false);
  273. document.getElementById('barbMinKnight').addEventListener('change', function(){
  274. Options.DFOptions.barbMinKnight=parseInt(document.getElementById('barbMinKnight').value);
  275. saveOptions();
  276. },false);
  277. document.getElementById('barbMaxKnight').addEventListener('change', function(){
  278. Options.DFOptions.barbMaxKnight=parseInt(document.getElementById('barbMaxKnight').value);
  279. saveOptions();
  280. },false);
  281. document.getElementById('pbaothreshold').addEventListener('change', function(){
  282. Options.DFOptions.threshold=parseInt(document.getElementById('pbaothreshold').value);
  283. saveOptions();
  284. },false);
  285. document.getElementById('barbstopsearch').addEventListener('change', function(){
  286. document.getElementById('barbstopsearch').value = parseInt(document.getElementById('barbstopsearch').value)>0?document.getElementById('barbstopsearch').value:1
  287. Options.DFOptions.stopsearch=parseInt(document.getElementById('barbstopsearch').value);
  288. saveOptions();
  289. },false);
  290. },
  291. showBarbs: function (citynumber,cityname) {
  292. var t = Tabs.Barb;
  293. var popTradeRoutes = null;
  294. t.popTradeRoutes = new CPopup('pbShowBarbs', 0, 0, 500, 500, true, function() {clearTimeout (1000);});
  295. var m = '<DIV style="max-height:460px; height:460px; overflow-y:auto"><TABLE align=center cellpadding=0 cellspacing=0 width=100% class="pbShowBarbs" id="pbBars">';
  296. t.popTradeRoutes.getMainDiv().innerHTML = '</table></div>' + m;
  297. t.popTradeRoutes.getTopDiv().innerHTML = '<TD align=center><B>Dark Forests for city: '+cityname+'</td>';
  298. t.paintBarbs(citynumber,cityname);
  299. t._addTabHeader(citynumber,cityname);
  300. t.popTradeRoutes.show(true) ;
  301. },
  302. paintBarbs: function(i,cityname){
  303. var t = Tabs.Barb;
  304. if (t.barbArray[i] == undefined) return;
  305. for (k=(t.barbArray[i].length-1);k>=0;k--){t._addTab(i,cityname,k+1,t.barbArray[i][k]['x'], t.barbArray[i][k]['y'],t.barbArray[i][k]['dist'], t.barbArray[i][k]['level']);}
  306. },
  307. _addTab: function(citynumber,cityname,queueId,X,Y,dist,level){
  308. var t = Tabs.Barb;
  309. var row = document.getElementById('pbBars').insertRow(0);
  310. row.vAlign = 'top';
  311. row.insertCell(0).innerHTML = queueId;
  312. row.insertCell(1).innerHTML = X;
  313. row.insertCell(2).innerHTML = Y;
  314. row.insertCell(3).innerHTML = dist;
  315. row.insertCell(4).innerHTML = level;
  316. row.insertCell(5).innerHTML = '<a class="button20" id="barbdel_' + queueId + '"><span>Delete</span></a>';
  317. document.getElementById('barbdel_' + queueId).addEventListener('click', function(){
  318. t.deleteBarbElement(citynumber,queueId,cityname, true);
  319. }, false);
  320. },
  321. _addTabHeader: function(citynumber,cityname) {
  322. var t = Tabs.Barb;
  323. var row = document.getElementById('pbBars').insertRow(0);
  324. row.vAlign = 'top';
  325. row.insertCell(0).innerHTML = "City";
  326. row.insertCell(1).innerHTML = "X";
  327. row.insertCell(2).innerHTML = "Y";
  328. row.insertCell(3).innerHTML = "Dist.";
  329. row.insertCell(4).innerHTML = "Level";
  330. row.insertCell(5).innerHTML = '<a class="button20" id="barbdelAll"><span>Delete ALL</span></a>';
  331. document.getElementById('barbdelAll').addEventListener('click', function(){
  332. t.deleteBarbsCity(citynumber,cityname);
  333. }, false);
  334. },
  335. deleteBarbElement: function(citynumber,queueId,cityname,showFlag){
  336. var t = Tabs.Barb;
  337. var queueId = parseInt(queueId);
  338. var myarray = t.barbArray[citynumber];
  339. if (myarray) {
  340. myarray.splice((queueId-1), 1);
  341. GM_setValue('DF_' + unsafeWindow.tvuid + '_city_' + citynumber + '_' + getServerId(), JSON2.stringify(myarray));
  342. t.checkBarbData();
  343. if (showFlag) t.showBarbs(citynumber,cityname);
  344. }
  345. else
  346. {
  347. //logit("not found");
  348. }
  349. },
  350. deleteBarbsCity: function(citynumber,cityname){
  351. var t = Tabs.Barb;
  352. var queueId = parseInt(queueId);
  353. Options.DFOptions.Update[citynumber][1] = 0;
  354. GM_deleteValue('DF_' + unsafeWindow.tvuid + '_city_' + citynumber + '_' + getServerId())
  355. GM_deleteValue('DF_' + Seed.player['name'] + '_city_' + citynumber + '_' + getServerId())
  356. t.checkBarbData();
  357. t.showBarbs(citynumber,cityname);
  358. //reloadKOC();
  359. },
  360. saveTroops: function(){
  361. var t = Tabs.Barb;
  362. for(i=0;i<15;i++){
  363. for (w=0;w<t.troopDef.length;w++){
  364. Options.DFOptions.Troops[i+1][w+1] = parseIntNan(document.getElementById('level'+i+'troop'+w).value);
  365. }
  366. if(parseIntNan(document.getElementById('dist'+i).value) > Options.DFOptions.MaxDistance)
  367. document.getElementById('dist'+i).value = Options.DFOptions.MaxDistance;
  368. Options.DFOptions.MinDistance[i+1] = parseIntNan(document.getElementById('Mindist'+i).value);
  369. Options.DFOptions.Distance[i+1] = parseIntNan(document.getElementById('dist'+i).value);
  370. }
  371. saveOptions();
  372. },
  373. deletebarbs: function(){
  374. for (i=1;i<=Seed.cities.length;i++){
  375. Options.DFOptions.Update[i][1] = 0;
  376. GM_deleteValue('DF_' + unsafeWindow.tvuid + '_city_' + i + '_' + getServerId())
  377. GM_deleteValue('DF_' + Seed.player['name'] + '_city_' + i + '_' + getServerId())
  378. }
  379. //reloadKOC();
  380. },
  381.  
  382. checkBarbData: function(){
  383. var t = Tabs.Barb;
  384. if(!Options.DFOptions.Running) return;
  385.  
  386. for (var citynum=1; citynum <= Cities.length; citynum++){
  387. if (!Options.DFOptions.Levels[citynum][0]) continue; //Skip city if not selected
  388.  
  389. // Use a single, consistent storage key
  390. var dfKey = 'DF_' + getServerId() + '_' + unsafeWindow.tvuid + '_city_' + citynum;
  391. t.barbArray[citynum] = JSON2.parse(GM_getValue(dfKey,'[]'));
  392.  
  393. if (t.barbArray[citynum].length == 0 && !t.searchRunning)
  394. t.barbArray[citynum] = [];
  395. var myarray = JSON2.parse(GM_getValue('DF_' + unsafeWindow.tvuid + '_city_' + citynum + '_' + getServerId(),"[]"));
  396. if (myarray == null) myarray = JSON2.parse(GM_getValue('DF_' + Seed.player['name'] + '_city_' + citynum + '_' + getServerId(),"[]"));
  397. console.log("AutoDF Check Log 1 = myarray= "+myarray);
  398. if ((myarray == undefined || myarray.length == 0) && t.searchRunning==false) {
  399. t.lookup=citynum;
  400. if(parseInt(Options.DFOptions.Update[t.lookup][1]) >= parseInt(Options.DFOptions.stopsearch)) continue; //Skip if search results are empty more than X times
  401. t.searchRunning = true;
  402. t.opt.startX = parseInt(Seed.cities[(citynum-1)][2]);
  403. t.opt.startY = parseInt(Seed.cities[(citynum-1)][3]);
  404. t.clickedSearch();
  405. }
  406. console.log("AutoDF Check Log 2 = myarray = "+Array.isArray(myarray));
  407. console.log("AutoDF Check Log = "+Array.isArray(myarray));
  408. if (myarray && Array.isArray(myarray)){
  409. if(Options.DFOptions.Method == 'distance') t.barbArray[citynum] = myarray.sort(function sortBarbs(a,b) {a = a['dist'];b = b['dist'];return a == b ? 0 : (a < b ? -1 : 1);});
  410. if(Options.DFOptions.Method == 'level') t.barbArray[citynum] = myarray.sort(function sortBarbs(a,b) {a = a['level']+a['dist'];b = b['level']+b['dist'];return parseInt(a) == parseInt(b) ? 0 : (parseInt(a) > parseInt(b) ? -1 : 1);});
  411. if(Options.DFOptions.Method == 'lowlevel') t.barbArray[citynum] = myarray.sort(function sortBarbs(a,b) {a = a['level']+a['dist'];b = b['level']+b['dist'];return parseInt(a) == parseInt(b) ? 0 : (parseInt(a) < parseInt(b) ? -1 : 1);});
  412. GM_setValue('DF_' + unsafeWindow.tvuid + '_city_' + citynum + '_' + getServerId(), JSON2.stringify(t.barbArray[citynum]));
  413. }
  414. Options.DFOptions.Update[citynum][1] = 0;
  415. saveOptions();
  416. }
  417. t.nextattack = setTimeout(t.getnextCity, parseInt((1+Options.DFOptions.SendInterval)*1000));
  418. },
  419. toggleBarbState: function(obj){
  420. obj = document.getElementById('AttSearch');
  421. var t = Tabs.Barb;
  422. if (Options.DFOptions.Running == true) {
  423. Options.DFOptions.Running = false;
  424. obj.value = "Attack = OFF";
  425. if(document.getElementById('DFToggleTab'))document.getElementById('DFToggleTab').innerHTML = '<span style="color: #CCC">'+unsafeWindow.g_js_strings.commonstr.darkForest+': Off</span>';
  426. saveOptions();
  427. t.nextattack = null;
  428. } else {
  429. Options.DFOptions.Running = true;
  430. obj.value = "Attack = ON";
  431. if(document.getElementById('DFToggleTab'))document.getElementById('DFToggleTab').innerHTML = '<span style="color: #FFFF00">'+unsafeWindow.g_js_strings.commonstr.darkForest+': On</span>';
  432. saveOptions();
  433. t.checkBarbData();
  434. t.nextattack = setTimeout(t.getnextCity, parseInt((1+Options.DFOptions.SendInterval)*1000));
  435. }
  436. },
  437. barbing : function(){
  438. var t = Tabs.Barb;
  439. var city = t.city;
  440. citynumber = Seed.cities[city-1][0];
  441. cityID = 'city' + citynumber;
  442. t.getAtkKnight(cityID);
  443. var slots = March.getMarchSlots(citynumber);
  444. //Only send DF if city is not over 750K astone:: rewritten I want df's to farm items and level knights.. who cares about aetherstone? -baos
  445. if (Seed.resources[cityID]["rec5"][0] > Number(Options.DFOptions.threshold)) {
  446. return;
  447. };
  448. var element1 = 'pddatacity'+(city-1);
  449. if (t.barbArray[city].length == 0) document.getElementById(element1).innerHTML = 'In search mode'; else
  450. document.getElementById(element1).innerHTML = 'Sent: ' + Options.DFOptions.BarbsDone[city];
  451. var element2 = 'pddataarray'+(city-1);
  452. document.getElementById(element2).innerHTML = 'RP: (' + slots + '/' + March.getTotalSlots(citynumber) +')';
  453. if (Number(Number(March.getTotalSlots(citynumber))-Number(slots)) <= Number(Options.DFOptions.RallyClip)) return;
  454. if (t.knt.toSource() == "[]") return;
  455. var kid = t.knt[0].ID;
  456. if(t.barbArray[city] && t.barbArray[city].length > 0){
  457. var barbinfo = t.barbArray[city].shift();
  458. }else if(parseInt(Options.DFOptions.Update[city][1])==0){
  459. if(!t.searchRunning)t.checkBarbData();
  460. return;
  461. } else {
  462. return;
  463. };
  464. var check=0;
  465. var barblevel = parseInt(barbinfo.level);
  466. if (Options.DFOptions.Levels[city][barbinfo.level])
  467. check=1;
  468. if (barbinfo.dist < Options.DFOptions.MinDistance[barblevel] || barbinfo.dist > Options.DFOptions.Distance[barblevel]){
  469. check=0;
  470. GM_setValue('DF_' + unsafeWindow.tvuid + '_city_' + city + '_' + getServerId(), JSON2.stringify(t.barbArray[city]));
  471. return;
  472. }
  473. // check troop levels in city
  474. var trps = Options.DFOptions.Troops[barblevel];
  475. var num_troops = 0;
  476. for (var ii=1; ii<t.troopDef.length+1; ii++) {
  477. if (parseInt(trps[ii]) > Seed.units[cityID]['unt'+t.troopDef[ii-1][1]]) check = 0;
  478. num_troops += trps[ii];
  479. }
  480. if (num_troops == 0) check = 0;
  481. if (check == 0){
  482. t.barbArray[city].push(barbinfo);
  483. GM_setValue('DF_' + unsafeWindow.tvuid + '_city_' + city + '_' + getServerId(), JSON2.stringify(t.barbArray[city]));
  484. return;
  485. }
  486. var element = 'pdtotalcity'+(city-1);
  487. if (t.barbArray[city] == undefined) document.getElementById(element).innerHTML = 'No Data';
  488. else document.getElementById(element).innerHTML = 'Forests:' + t.barbArray[city].length;
  489. var xcoord = barbinfo['x'];
  490. var ycoord = barbinfo['y'];
  491. t.doBarb(citynumber,city,xcoord,ycoord,barblevel,kid,trps);
  492. saveOptions();
  493. },
  494.  
  495. getnextCity: function(){
  496. var t = Tabs.Barb;
  497. if(!Options.DFOptions.Running) return;
  498. var city = t.city+1;
  499. if (city>Seed.cities.length){
  500. city=1;
  501. }
  502.  
  503. for (i=city; i<=Seed.cities.length; i++) {
  504. if (!Options.DFOptions.Levels[i][0]) continue; //Skip city if not selected
  505. else {
  506. city=i;
  507. break;
  508. }
  509. }
  510.  
  511. t.city = city;
  512. if(Options.DFOptions.UpdateEnabled){
  513. var now = unixTime();
  514. if(now > parseInt(Options.DFOptions.Update[city][0] + (Options.DFOptions.UpdateInterval*60))){
  515. Options.DFOptions.Update[city][1]=0;
  516. t.barbArray[city] = []; //Clears data if last update was more than X minutes
  517. GM_deleteValue('DF_' + unsafeWindow.tvuid + '_city_' + city + '_' + getServerId())
  518. GM_deleteValue('DF_' + Seed.player['name'] + '_city_' + city + '_' + getServerId())
  519. GM_setValue('DF_' + unsafeWindow.tvuid + '_city_' + city + '_' + getServerId(), JSON2.stringify(t.barbArray[city]));
  520. }
  521. }
  522. if(Options.DFOptions.Levels[city][0]){
  523. t.barbing();
  524. t.nextattack = setTimeout(t.getnextCity, parseInt((1+Options.DFOptions.SendInterval)*1000));
  525. } else {
  526. t.getnextCity();
  527. }
  528. },
  529. getAtkKnight : function(cityID){
  530. var t = Tabs.Barb;
  531. t.knt = new Array();
  532. for (k in Seed.knights[cityID]){
  533. if (Seed.knights[cityID][k]["knightStatus"] == 1 && Seed.leaders[cityID]["resourcefulnessKnightId"] != Seed.knights[cityID][k]["knightId"] && Seed.leaders[cityID]["politicsKnightId"] != Seed.knights[cityID][k]["knightId"] && Seed.leaders[cityID]["combatKnightId"] != Seed.knights[cityID][k]["knightId"] && Seed.leaders[cityID]["intelligenceKnightId"] != Seed.knights[cityID][k]["knightId"] && Seed.knights[cityID][k]["combat"] >= Options.DFOptions.barbMinKnight && Seed.knights[cityID][k]["combat"] <= Options.DFOptions.barbMaxKnight){
  534. t.knt.push ({
  535. Name: Seed.knights[cityID][k]["knightName"],
  536. Combat: Seed.knights[cityID][k]["combat"],
  537. ID: Seed.knights[cityID][k]["knightId"],
  538. });
  539. }
  540. }
  541. t.knt = t.knt.sort(function sort(a,b) {
  542. a = parseInt(a['Combat']);
  543. b = parseInt(b['Combat']);
  544. if(parseInt(Options.DFOptions.knightselector) > 0)
  545. return a == b ? 0 : (a > b ? -1 : 1);
  546. else
  547. return a == b ? 0 : (a < b ? -1 : 1);
  548. });
  549. },
  550. doBarb: function(cityID,counter,xcoord,ycoord,level,kid,trps){
  551. var t = Tabs.Barb;
  552. var dtime = new Date()
  553. var params = unsafeWindow.Object.clone(unsafeWindow.g_ajaxparams);
  554. params.cid=cityID;
  555. params.type=4;
  556. params.kid=kid;
  557. params.xcoord = xcoord;
  558. params.ycoord = ycoord;
  559. for (ii=1; ii<parseInt(t.troopDef.length+1); ii++) {
  560. if(parseInt(trps[ii]) > Seed.units['city'+cityID]['unt'+t.troopDef[ii-1][1]]){
  561. document.getElementById('dferrorlog').innerHTML = '<FONT color=red>'+dtime.toLocaleString()+' '+Cities.byID[cityID].name+' dark forest failed: Not doing march, not enough units </FONT>';
  562. return;
  563. };
  564. if(parseInt(trps[ii]) > 0)
  565. params['u'+t.troopDef[ii-1][1]]=trps[ii];
  566. };
  567.  
  568. Options.DFOptions.BarbsTried++;
  569. document.getElementById('pberror1').innerHTML = 'Tries:'+ Options.DFOptions.BarbsTried;
  570. March.addMarch(params, function(rslt){
  571. if(rslt.ok) {
  572. Options.DFOptions.BarbsDone[counter]++;
  573. var element1 = 'pddatacity'+(counter-1);
  574. document.getElementById(element1).innerHTML = 'Sent: ' + Options.DFOptions.BarbsDone[counter];
  575. var element2 = 'pddataarray'+(counter-1);
  576. document.getElementById(element2).innerHTML = 'RP: (' + March.getMarchSlots(cityID) + '/' + March.getTotalSlots(cityID) +')';
  577. GM_setValue('DF_' + unsafeWindow.tvuid + '_city_' + counter + '_' + getServerId(), JSON2.stringify(t.barbArray[counter]));
  578. saveOptions();
  579. } else {
  580. if(rslt.error_code && rslt.msg)document.getElementById('dferrorlog').innerHTML = '<FONT color=red>'+dtime.toLocaleString()+' '+Cities.byID[cityID].name+' dark forest failed: '+rslt.msg+'</FONT>';
  581. //logit( inspect(rslt,3,1));
  582. if (rslt.error_code != 8 && rslt.error_code != 213 && rslt.error_code == 210) Options.DFOptions.BarbsFailedVaria++;
  583. if (rslt.error_code == 213)Options.DFOptions.BarbsFailedKnight++;
  584. if (rslt.error_code == 210) Options.DFOptions.BarbsFailedRP++;
  585. if (rslt.error_code == 4)document.getElementById('dferrorlog').innerHTML = '<FONT color=red>'+dtime.toLocaleString()+' '+Cities.byID[cityID].name+' dark forest failed: Not enough units</FONT>';
  586. if (rslt.error_code == 8) {
  587. Options.DFOptions.BarbsFailedTraffic++;
  588. t.doBarb(cityID,counter,xcoord,ycoord,level,kid,trps);
  589. return;
  590. }
  591. if (rslt.error_code == 104) {
  592. Options.DFOptions.BarbsFailedBog++;
  593. GM_setValue('DF_' + unsafeWindow.tvuid + '_city_' + counter + '_' + getServerId(), JSON2.stringify(t.barbArray[counter]));
  594. new t.barbing();
  595. saveOptions();
  596. }
  597. document.getElementById('pberror2').innerHTML = 'Excess Traffic errors:' + Options.DFOptions.BarbsFailedTraffic;
  598. document.getElementById('pberror3').innerHTML = 'Rally Point errors: '+ Options.DFOptions.BarbsFailedRP;
  599. document.getElementById('pberror4').innerHTML = 'Knight errors:' + Options.DFOptions.BarbsFailedKnight;
  600. document.getElementById('pberror5').innerHTML = 'Other errors:' + Options.DFOptions.BarbsFailedVaria;
  601. document.getElementById('pberror6').innerHTML = 'Bog errors:' + Options.DFOptions.BarbsFailedBog;
  602. //unsafeWindow.Modal.showAlert(printLocalError((rslt.error_code || null), (rslt.msg || null), (rslt.feedback || null)))
  603. }
  604. });
  605. //saveOptions();
  606. },
  607. clickedSearch : function (){
  608. var t = Tabs.Barb;
  609. t.opt.maxDistance = parseInt(Options.DFOptions.MaxDistance);
  610. t.opt.searchDistance = t.opt.maxDistance;
  611. t.opt.searchShape = 'circle';
  612. t.mapDat = [];
  613. t.firstX = t.opt.startX - t.opt.maxDistance;
  614. t.firstY = t.opt.startY - t.opt.maxDistance;
  615. t.tilesSearched = 0;
  616. t.tilesFound = 0;
  617. var element = 'pddatacity'+(t.lookup-1);
  618. var element2 = 'pddataarray'+(t.lookup-1);
  619. document.getElementById(element2).innerHTML == '';
  620. t.BlockList = t.MapAjax.generateBlockList(t.firstX,t.firstY,t.opt.maxDistance);
  621. var counter = t.BlockList.length;
  622. if (counter > MAX_BLOCKS) { counter = MAX_BLOCKS; }
  623.  
  624. var curX = t.firstX;
  625. var curY = t.firstY;
  626. document.getElementById(element).innerHTML = 'Searching at '+ curX +','+ curY;
  627. t.Blocks = [];
  628. for (var i=1;i<=counter;i++) {
  629. t.Blocks.push(t.BlockList.shift());
  630. t.blocksSearched++;
  631. }
  632. var blockString = t.Blocks.join("%2C");
  633. setTimeout (function(){t.MapAjax.LookupMap (blockString, t.mapCallback)}, MAP_DELAY);
  634. },
  635. mapCallback : function (rslt){
  636. var t = Tabs.Barb;
  637. if (!t.searchRunning)
  638. return;
  639. if (rslt.ok){
  640. var cityID = 'city' + Seed.cities[t.lookup-1][0];
  641. map = rslt.data;
  642. var tiles = [];
  643. for(x in Seed.queue_atkp[cityID]) {
  644. tiles.push(Seed.queue_atkp[cityID][x].toTileId);
  645. }
  646. for (k in map){
  647. if (map[k].tileType==54 && Options.DFOptions.Levels[t.lookup][map[k].tileLevel]){
  648. var dist = distance (t.opt.startX, t.opt.startY, map[k].xCoord, map[k].yCoord);
  649. if(dist <= parseInt(Options.DFOptions.MaxDistance))
  650. if(dist <= parseInt(Options.DFOptions.Distance[map[k].tileLevel]))
  651. if(tiles.indexOf(map[k].tileId) == -1)
  652. t.mapDat.push ({time:0,x:map[k].xCoord,y:map[k].yCoord,dist:dist,level:map[k].tileLevel});
  653. //else logit('skipping '+map[k].xCoord+','+map[k].yCoord);
  654. }
  655. }
  656. }
  657. else {
  658. if (rslt.BotCode && rslt.BotCode==999) { // map captcha
  659. var dtime = new Date();
  660. document.getElementById('dferrorlog').innerHTML = '<FONT color=red>'+dtime.toLocaleString()+' '+Cities.byID[Seed.cities[t.lookup-1][0]].name+' Green Map detected! </FONT>';
  661. }
  662. }
  663. t.tilesSearched += (t.opt.searchDistance*t.opt.searchDistance);
  664.  
  665. var element0 = 'pdtotalcity'+(t.lookup-1);
  666. if (t.mapDat.length < 1) document.getElementById(element0).innerHTML = 'No Data';
  667. else document.getElementById(element0).innerHTML = 'Forests:' + t.mapDat.length;
  668. var element = 'pddatacity'+(t.lookup-1);
  669. var counter = t.BlockList.length;
  670. if (counter==0 || t.curY==999) {
  671. t.stopSearch('Found: ' + t.mapDat.length);
  672. return;
  673. }
  674. if (counter > MAX_BLOCKS) { counter = MAX_BLOCKS; }
  675.  
  676. var nextblock = t.BlockList[0];
  677. var curX = nextblock.split("_")[1];
  678. var curY = nextblock.split("_")[3];
  679. document.getElementById(element).innerHTML = 'Searching at '+ curX +','+ curY;
  680.  
  681. t.Blocks = [];
  682. for (var i=1;i<=counter;i++) {
  683. t.Blocks.push(t.BlockList.shift());
  684. t.blocksSearched++;
  685. }
  686. var blockString = t.Blocks.join("%2C");
  687. setTimeout (function(){t.MapAjax.LookupMap (blockString, t.mapCallback)}, MAP_DELAY);
  688. },
  689. callStop: function(){
  690. var t = Tabs.Barb;
  691. t.curY=999;
  692. t.stopSearch('Found: ' + t.mapDat.length);
  693. },
  694. stopSearch : function (msg){
  695. var t = Tabs.Barb;
  696. var element = 'pddatacity'+(t.lookup-1);
  697. document.getElementById(element).innerHTML = msg;
  698. GM_setValue('DF_' + unsafeWindow.tvuid + '_city_' + t.lookup + '_' + getServerId(), JSON2.stringify(t.mapDat));
  699. Options.DFOptions.Update[t.lookup][0] = unixTime();
  700. Options.DFOptions.Update[t.lookup][1]++;
  701. t.searchRunning = false;
  702. saveOptions();
  703. t.checkBarbData();
  704. return;
  705. },
  706. hide : function (){
  707. },
  708.  
  709. show : function (){
  710. },
  711.  
  712. };

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址