· 4 years ago · Apr 21, 2021, 10:10 PM
1var backgroundColor = "#32313f";
2var borderColor = "#3e6147";
3var headerColor = "#202825";
4var titleColor = "#ffffdf";
5
6var headerColorPlayers="#323232"
7var headerColorCoords="#4d4d4d"
8var headerColorFirstRow="#666600"
9
10var dropboxToken='voeQxD123fdAAAA';
11dropboxToken+="AAAAAAAWadfbsqR6"
12dropboxToken+="fFyKdfA2dgd05UhE"
13dropboxToken+="t-ztkJqkssgw6PkMTzk"
14
15
16var filename_reports="116Reports.txt";
17var filename_incomings="Incomings.txt";
18var filename_users="Users.txt";
19var filename_support="Support.txt"
20var filename_commands_attack="Commands_attack.txt"
21var filname_ino_db="inno_database.txt"
22var filname_status_upload="status.txt"
23
24
25
26
27var speedWorld=getSpeedConstant().worldSpeed;
28var speedTroupes=getSpeedConstant().unitSpeed;
29
30var speedWorld=2
31var speedTroupes=0.5
32var nobleSpeed=2100*1000/(speedWorld*speedTroupes)//ms
33var ramSpeed=1800*1000/(speedWorld*speedTroupes)//ms
34var swordSpeed=1320*1000/(speedWorld*speedTroupes)//ms
35var axeSpeed=1080*1000/(speedWorld*speedTroupes)//ms
36
37//formula ((base time/100)/speedWorld) * stable time factor //https://forum.tribalwars.net/index.php?threads/next-lvl-of-barracks-unit-production-speed.54638/
38var axeTime=Math.round( ((1320/100.0)/speedWorld) * 15.58823529 ) *1000//milisec
39var lhTime=Math.round( ((1800/100.0)/speedWorld) * 20.88235294 ) *1000//milisec
40var ramTime=Math.round( ((4800/100.0)/speedWorld) * 27.84313725 ) *1000//milisec
41
42
43
44
45//verify acces users
46let response_users= getUsers()
47var tribemates=response_users.split("\n").map(e=>{return e.trim().toLowerCase()})
48console.log(tribemates)
49if(!tribemates.includes(game_data.player.name.toLowerCase())){
50 UI.ErrorMessage("try later","slow")
51 throw new Error("you do not have acces");
52 // console.log("you do not have acces" )
53}
54if(game_data.locale!="en_DK" && game_data.world!="en116" )
55 throw new Error("it doesn't work");
56
57
58var engWord=[
59 "supports",
60 "today",
61 "tomorrow",
62 "on",
63 "attack"
64]
65var roWord=[
66 "sprijină",
67 "astăzi",
68 "mâine",
69 "data",
70 "atac"
71]
72var wordsTranslate=engWord
73
74var troopsPop = {
75 spear : 1,
76 sword : 1,
77 axe : 1,
78 archer : 1,
79 spy : 2,
80 light : 4,
81 marcher : 5,
82 heavy : 6,
83 ram : 5,
84 catapult : 8,
85 knight : 10,
86 snob : 100
87};
88{/* <img src="https://img.icons8.com/officel/16/000000/long-arrow-right.png"/> */}
89{/* <img src="https://img.icons8.com/officel/16/000000/long-arrow-left.png"/> */}
90
91html = `
92<div id="div_container" class="ui-widget-content div_remove" style="width:600px;background-color:${backgroundColor};cursor:move;z-index:50;">
93 <div class="close-btn" onclick="closeWindow()" style="position:absolute;top:10px;right: 10px;"><b><a href=#><font color="${titleColor}">X</font></b></a></div>
94 <div id="page_support" style="position:absolute;top:10px;left: 10px;" onclick="viewSupport()" ><a href="#"><img src="https://img.icons8.com/officel/30/000000/long-arrow-right.png"/></a></div>
95
96 <div id="minimize_page" style="position:absolute;top:10px;left:550px;background-color:white"><a href="#"><img src="https://img.icons8.com/material-outlined/16/000000/collapse.png"/></a></div>
97 <h2><center style="margin:10px"><u><font color="${titleColor}">Upload data</font></u></center></h2>
98 <div id="div_minimize">
99 <table id="table_upload" class="" border="1" style="width: 100%;background-color:${backgroundColor};border-color:${borderColor}">
100 <tr>
101 <td style="text-align:center; width:auto; background-color:${headerColor}">
102 <h2><center style="margin:10px"><u><font color="${titleColor}">reports</font></u></center></h2>
103 </td>
104 <td style="text-align:center; width:auto; background-color:${headerColor}">
105 <center style="margin:10px"><u><input class="btn" type="button" id="upload_reports" onclick="uploadReportsManual()" value="Upload manual"></center>
106 <center style="margin:10px"><u><input class="btn" type="button" id="upload_reports" onclick="uploadReports()" value="Upload auto"></center>
107
108 </td>
109 <td style="text-align:center; width:auto; background-color:${headerColor}">
110 <p><center style="margin:10px"><font color="${titleColor}" id="progress_reports">progress</font></center></p>
111 </td>
112 </tr>
113 <tr>
114 <td style="text-align:center; width:auto; background-color:${headerColor}">
115 <h2><center style="margin:10px"><u><font color="${titleColor}">incomings</font></u></center></h2>
116 </td>
117 <td style="text-align:center; width:auto; background-color:${headerColor}">
118 <center style="margin:10px"><u><input class="btn" type="button" id="upload_incomings" onclick="uploadIncomings()" value="Upload"></center>
119 </td>
120 <td style="text-align:center; width:auto; background-color:${headerColor}">
121 <p><center style="margin:10px" ><font color="${titleColor}" id="progress_incomings">progress</font></center></p>
122 </td>
123 </tr>
124 <tr>
125 <td style="text-align:center; width:auto; background-color:${headerColor}">
126 <h2><center style="margin:10px"><u><font color="${titleColor}">Commands</font></u></center></h2>
127 </td>
128 <td style="text-align:center; width:auto; background-color:${headerColor}">
129 <center style="margin:10px"><u><input class="btn" type="button" onclick="uploadSupports()" value="Upload"></center>
130 </td>
131 <td style="text-align:center; width:auto; background-color:${headerColor}">
132 <p><center style="margin:10px" ><font color="${titleColor}" id="progress_support">progress</font></center></p>
133 </td>
134 </tr>
135 <tr>
136 <td style="text-align:center; width:auto; background-color:${headerColor}">
137 <h2><center style="margin:10px"><u><font color="${titleColor}">All info</font></u></center></h2>
138 </td>
139 <td style="text-align:center; width:auto; background-color:${headerColor}">
140 <center style="margin:10px"><u><input class="btn" type="button" onclick="uploadAll()" value="Upload all"></center>
141 </td>
142 <td style="text-align:center; width:auto; background-color:${headerColor}">
143 <p><center style="margin:10px" ><font color="${titleColor}" id="progress_all">progress</font></center></p>
144 </td>
145 </tr>
146 </table>
147 <h2><center style="margin:10px"><u><font color="${titleColor}">Search reports</font></u></center></h2>
148 <table id="table_upload" class="" border="1" style="width: 100%;background-color:${backgroundColor};border-color:${borderColor}">
149 <tr>
150 <td style="text-align:center; width:auto; background-color:${headerColor}">
151 <center style="margin:10px"><u><input class="btn" type="button" onclick="loadReports()" value="Load reports"></center>
152 </td>
153 <td style="text-align:center; width:auto; background-color:${headerColor}">
154 <center style="margin:10px"><u><input style="text-align: center;" type="text" id="input_search" onclick="" placeholder="coord" ></center>
155 </td>
156 <td style="text-align:center; width:auto; background-color:${headerColor}">
157 <p><center style="margin:10px"><font color="${titleColor}" id="progress_search">status</font></center></p>
158 </td>
159 </tr>
160 </table>
161 <center style="margin:10px"><div id="report_view" style="background-color:#d2c09e"> report view <div><center>
162 </div>
163</div>
164`;
165////////////////////////////////////////add and remove window from page///////////////////////////////////////////
166if(document.getElementById("incomings_table")==null){
167 $("#div_container").remove()
168 $("#contentContainer").eq(0).prepend(html);
169 $("#mobileContent").eq(0).prepend(html);
170
171 if(game_data.device=="desktop"){
172 $("#div_container").css("position","fixed");
173 $("#div_container").draggable();
174 }
175}
176function closeWindow(){
177 $(".div_remove").remove()
178 list_href=[]
179 // window.location.reload();
180}
181
182function getUsers(){
183 var result
184 $.ajax({
185 url: "https://content.dropboxapi.com/2/files/download",
186 method: 'POST',
187 dataType: "text",
188 async: false,
189 headers: { 'Authorization': 'Bearer ' + dropboxToken,
190 'Dropbox-API-Arg': JSON.stringify({path: "/"+filename_users})},
191
192 success: (data) => {
193 result=data
194
195 },error:(err)=>{
196 alert(err)
197 reject(err)
198 }
199 })
200 return result
201}
202
203function addWindow(){
204 $("#contentContainer").eq(0).prepend(html);
205 $("#mobileContent").eq(0).prepend(html);
206
207 if(game_data.device=="desktop"){
208 $("#div_container").css("position","fixed");
209 $("#div_container").draggable();
210 }
211}
212
213var loadReportsOk=false;
214$("#input_search").on("input",function(){
215 if(loadReportsOk==false)
216 UI.ErrorMessage("upload reports first","fast")
217})
218$("#input_search").mouseout(function(){
219if(loadReportsOk==false)
220 $("#input_search").val("");
221})
222$("#minimize_page").on("click",()=>{
223 $("#div_minimize").toggle(500)
224})
225
226
227
228if(document.getElementById("incomings_table")!=null){
229 window.setInterval(function(){
230
231 var rows= $(".row_a,.row_b")
232 console.log("check incomings")
233 for(let i=0;i<rows.length;i++)
234 {
235 let currentHour=rows[i].children[rows[i].children.length-1].innerText.split(":")
236 if(parseInt(currentHour[0])==0 && parseInt(currentHour[1])==0 && parseInt(currentHour[2])<20){
237 rows[i].remove();
238 }
239 // else{
240 // break;
241 // }
242 }
243 },10000)
244}
245
246
247
248var css =`
249.shadow20 {
250 text-shadow: 0 0 4px black, 0 0 4px black, 0 0 4px black, 0 0 4px black, 0 0 4px black;
251}
252
253`,
254head = document.head || document.getElementsByTagName('head')[0],
255style = document.createElement('style');
256
257head.appendChild(style);
258style.type = 'text/css';
259if (style.styleSheet){
260 // This is required for IE8 and below.
261 style.styleSheet.cssText = css;
262} else {
263 style.appendChild(document.createTextNode(css));
264}
265
266
267
268
269async function uploadAll(){
270 let resultReports= await uploadReports().catch(err=>alert(err))
271 console.log("status uploads",resultReports)
272 let resultIncomings= await uploadIncomings().catch(err=>alert(err))
273 console.log("status incomings",resultIncomings)
274 let resultSupports= await uploadSupports().catch(err=>alert(err))
275 console.log("status support",resultSupports)
276
277
278
279
280}
281
282
283/////////////////////////////////////////////////get all reports info//////////////////////////////////////////////////////////////////
284async function uploadReports(){
285
286
287 document.getElementById("progress_reports").innerText="get links..";
288
289 let nameHistoryReports=game_data.world +"HistoryReports"
290 let map_idReports=new Map();
291 let current_page=window.location.href;
292 if(localStorage.getItem(nameHistoryReports)==null){
293 localStorage.setItem(nameHistoryReports,JSON.stringify(Array.from(new Map().entries())))
294 }
295 else{
296 map_idReports=new Map(JSON.parse(localStorage.getItem(nameHistoryReports)));
297 Array.from(map_idReports.keys()).forEach(el=>{
298 let currentDate=new Date();
299 let reportDate=new Date(map_idReports.get(el))
300 if(currentDate.getTime()- reportDate.getTime() > 40*24*3600*1000){
301 console.log("remove: "+map_idReports.get(el))
302 map_idReports.delete(el)
303 }
304 })
305
306 }
307 var [list_href, mapVillage]=await Promise.all([getLinks(true,map_idReports),getInfoVIllages() ]).catch(err=>{alert(err)})
308 console.log(mapVillage)
309
310
311 console.log("aici baaa")
312 console.log("map_idReports",map_idReports)
313
314 $(document).on('click','.autoHideBox',function(){
315 UI.SuccessMessage("stop",2000)
316 list_href=[]
317 })
318
319
320 list_href=list_href.reverse();
321 console.log(list_href)
322 var list_data_reports=[]
323 var nr_reports=0;
324 var nr_reports_total=list_href.length
325 addWindow();
326 document.getElementById("progress_reports").innerText=nr_reports+"/"+nr_reports_total+" reports";
327 // UI.InfoMessage(nr_reports+"/"+nr_reports_total+" reports")
328 var current_url
329
330 return new Promise(async(resolve,reject)=>{
331 async function ajaxRequest (urls) {
332 var time= 0
333 if(urls.length>0)
334 current_url=urls.pop().href;
335 else
336 current_url="stop"
337 console.log("inside function "+urls.length)
338 if (urls.length >= 0 && current_url!= "stop") {
339 var start_ajax=new Date()
340 $.ajax({
341 method: 'GET',
342 url: current_url,
343 })
344 .done(function (result) {
345 document.body.innerHTML= result;
346 result=null
347 // addWindow();
348 var startReport=new Date().getTime();
349 let list=getDataReport(tribemates);
350 var stopReport=new Date().getTime();
351 console.log(stopReport-startReport)
352 console.log(list)
353 if(list==null ){
354 console.log("recaptcha, upload again")
355 UI.ErrorMessage("recaptcha, upload again","slow")
356 addWindow();
357 document.getElementById("progress_reports").innerText="recaptcha";
358 list_href=[]
359
360 }
361 else{
362 console.log("reports info "+list.length)
363 for(let j=0;j<list.length;j++){
364 list_data_reports.push({"coord":list[j].coord,"reportInfo":list[j].reportInfo});
365 }
366 // document.getElementById("progress_reports").innerText=nr_reports+"/"+nr_reports_total+" reports";
367 UI.SuccessMessage(nr_reports+"/"+nr_reports_total+" reports")
368
369 nr_reports++;
370 let idReport= parseInt(current_url.match(/view=(\d+)/)[1]);
371 let currentDate=new Date().getFullYear()+"-"+(new Date().getMonth()+1)+"-"+new Date().getDate();
372 if(document.getElementsByClassName("unit-item unit-item-axe").length>0){
373 var time_report=document.getElementsByClassName("vis")[3].firstElementChild.children[1].children[1].innerText;
374 map_idReports.set(idReport,time_report)
375 }
376 else{
377 map_idReports.set(idReport,currentDate)
378 }
379 }
380 console.log("id_report "+map_idReports.size)
381 var stop_ajax=new Date();
382 var dif_time=stop_ajax.getTime()-start_ajax.getTime();
383 console.log("dif_time "+dif_time+" wait "+(200-dif_time))
384 window.setTimeout(function(){
385 ajaxRequest(list_href);
386 },200-dif_time)
387 });
388
389 }
390 else
391 {
392
393
394
395 ////////////////////////////////////extract data from dropbox/////////////////////////////////////////
396 console.log("before reading map from dropbox")
397 var [map_dropbox, mapStatus]=await Promise.all([readFileDropbox(filename_reports) ,readFileDropbox(filname_status_upload)]).catch(err=>{alert(err)})
398
399 map_dropbox=new Map( JSON.parse( lzw_decode(map_dropbox)));
400 console.log("map_dropbox before",map_dropbox)
401
402 //clear map if contains data on tribe mates
403 let counterAttacker=0;
404 let counterDefender=0;
405 let counterTypAttacker=0;
406 let counterTypeDefender=0;
407 Array.from(map_dropbox.keys()).forEach(key=>{
408 try {
409 let obj=map_dropbox.get(key)
410 let obj_village=mapVillage.get(key)
411 if(key == obj.coordAttacker){
412 if(tribemates.includes(obj.nameAttacker.toLowerCase()) || obj.nameAttacker.toLowerCase() != obj_village.playerName.toLowerCase() ){
413 map_dropbox.delete(key)
414 counterAttacker++
415 }
416 else if(obj.typeAttacker=="?"){
417 map_dropbox.delete(key)
418 counterTypAttacker++
419 }
420 }
421 else if(key == obj.coordDefender){
422 if(tribemates.includes(obj.nameDefender.toLowerCase()) || obj.nameDefender.toLowerCase() != obj_village.playerName.toLowerCase() ){
423 map_dropbox.delete(key)
424 counterDefender++
425 }
426 else if(obj.typeDefender=="?"){
427 map_dropbox.delete(key)
428 counterTypeDefender++
429 }
430 }
431 } catch (error) {
432 console.log(error)
433 }
434
435 })
436 console.log("remove counterAttacker",counterAttacker)
437 console.log("remove counterDefender",counterDefender)
438 console.log("remove counterTypAttacker",counterTypAttacker)
439 console.log("remove counterTypeDefender",counterTypeDefender)
440
441
442
443 console.log("map_dropbox after")
444 console.log(map_dropbox);
445 console.log("list_data_reports")
446 console.log(list_data_reports);
447
448
449 document.body.innerHTML= httpGet(current_page);
450 addWindow();
451 let nr_update=0;
452 let nr_write=0;
453 list_data_reports.forEach(function(el){
454 if(map_dropbox.has(el.coord)){//update el[0]=key
455 let obj_dropbox=map_dropbox.get(el.coord)
456
457 if(el.coord==el.reportInfo.coordAttacker ){
458 console.log("update for offensive" && el.reportInfo.typeAttacker!="?")
459 if(el.reportInfo.typeAttacker=="new_off"){
460 console.log("new_off, don't do anything")
461 }else{
462 console.log("coord exists in dropbox already")
463 let time_prev=new Date(obj_dropbox.time_report);
464 let time_current=new Date(el.reportInfo.time_report);
465 console.log(time_current-time_prev)
466 if(time_current-time_prev<48*3600*1000 && (el.reportInfo.typeAttacker=="def" )){//48 hours
467 console.log("it was def_cat")
468 map_dropbox.set(el.coord,{...obj_dropbox, ...el.reportInfo})//merge old info with new info
469 nr_update++;
470 }
471 else if(time_current-time_prev>0 ){
472 console.log("update coord: "+el.coord+" in dropbox")
473 map_dropbox.set(el.coord,{...obj_dropbox, ...el.reportInfo})//merge old info with new info
474 nr_update++;
475 }
476
477 }
478 }
479 if(el.coord==el.reportInfo.coordDefender && el.reportInfo.typeDefender!="?"){
480 console.log("update for defensive")
481 if(el.reportInfo.typeDefender=="new_off"){
482 console.log("new_off, don't do anything")
483 }else{
484 console.log("coord exists in dropbox already")
485 let time_prev=new Date(obj_dropbox.time_report);
486 let time_current=new Date(el.reportInfo.time_report);
487 console.log(time_current-time_prev)
488 if(time_current-time_prev<48*3600*1000 && (el.reportInfo.typeDefender=="def" )){//48 hours
489 console.log("it was def_cat")
490 map_dropbox.set(el.coord,{...obj_dropbox, ...el.reportInfo})
491 nr_update++;
492 }
493 else if(time_current-time_prev>0 ){
494 console.log("update coord: "+el.coord+" in dropbox")
495 map_dropbox.set(el.coord,{...obj_dropbox, ...el.reportInfo})
496 nr_update++;
497 }
498
499 }
500 }
501 }
502 else{//write
503 if(el.coord==el.reportInfo.coordAttacker && el.reportInfo.typeAttacker!="?"){
504 console.log("write coord in dropbox")
505 map_dropbox.set(el.coord,el.reportInfo)
506 nr_write++;
507 }
508 else if(el.coord==el.reportInfo.coordDefender && el.reportInfo.typeDefender!="?"){
509 console.log("write coord in dropbox")
510 map_dropbox.set(el.coord,el.reportInfo)
511 nr_write++;
512 }
513 }
514 })
515
516 let serverTime=document.getElementById("serverTime").innerText
517 let serverDate=document.getElementById("serverDate").innerText.split("/")
518 serverDate=serverDate[1]+"/"+serverDate[0]+"/"+serverDate[2]
519 let date_current=new Date(serverDate+" "+serverTime)
520
521 //update status map
522 let obj_status={
523 name:game_data.player.name,
524 report_date:date_current,
525 }
526
527
528 if(mapStatus=="[]")
529 mapStatus=new Map()
530 else
531 mapStatus=new Map(JSON.parse(mapStatus))
532
533 if(mapStatus.has(game_data.player.id)){
534 let obj_update=mapStatus.get(game_data.player.id)
535 mapStatus.set(game_data.player.id, {...obj_update, ...obj_status} )
536 }
537 else{
538 mapStatus.set(game_data.player.id,obj_status)
539 }
540
541
542
543
544 UI.SuccessMessage("compressing database, wait few seconds",2000)
545 let nr_start=new Date().getTime()
546 let length_data=JSON.stringify(Array.from(map_dropbox.entries())).length;
547
548 let data=JSON.stringify(Array.from(map_dropbox.entries()))
549 data=replaceSpecialCaracters(data)
550 data=lzw_encode(data)
551 let length_data_compressed=data.length;
552
553 let nr_stop=new Date().getTime()
554 console.log("after")
555 console.log(map_dropbox)
556 console.log("compressing data: "+(nr_stop-nr_start))
557 console.log("length before: "+length_data+" length after compression: "+length_data_compressed)
558 console.log("compression factor: "+(length_data/length_data_compressed) )
559
560 let data_status=JSON.stringify(Array.from(mapStatus.entries()))
561
562 let result=await uploadFile(data,filename_reports,dropboxToken).catch(err=>alert(err))
563 let resultStatus=await uploadFile(data_status,filname_status_upload,dropboxToken).catch(err=>alert(err))
564
565
566 if(result=="succes"){
567 localStorage.setItem(nameHistoryReports,JSON.stringify(Array.from(map_idReports.entries())))
568 console.log("save reports "+map_idReports.size)
569 document.getElementById("progress_reports").innerText="done";
570 UI.SuccessMessage("upload reports done\n update: "+nr_update+" \nwrite: "+nr_write,2000)
571 resolve("succes")
572
573 }
574 else
575 reject("error")
576
577 }
578 }
579 ajaxRequest(list_href);
580 })
581
582
583}
584
585/////////////////////////////////////////////////get all reports info MANUAL//////////////////////////////////////////////////////////////////
586async function uploadReportsManual(){
587 let types=["off","new_off","def","def_cat",'def_spy',"spy","def??","none"]
588 document.getElementById("progress_reports").innerText="get links..";
589
590 let nameHistoryReports=game_data.world +"HistoryReports"
591 var map_idReports=new Map();
592 var current_page=window.location.href;
593 if(localStorage.getItem(nameHistoryReports)==null){
594 localStorage.setItem(nameHistoryReports,JSON.stringify(Array.from(new Map().entries())))
595 }
596 else{
597 map_idReports=new Map(JSON.parse(localStorage.getItem(nameHistoryReports)));
598 Array.from(map_idReports.keys()).forEach(el=>{
599 let currentDate=new Date();
600 let reportDate=new Date(map_idReports.get(el))
601 if(currentDate.getTime()- reportDate.getTime() > 20*24*3600*1000){
602 console.log("remove: "+map_idReports.get(el))
603 map_idReports.delete(el)
604 }
605 })
606
607 }
608
609 var [list_href, mapVillage]=await Promise.all([getLinks(true,map_idReports),getInfoVIllages() ]).catch(err=>{alert(err)})
610
611
612 $(document).on('click','.autoHideBox',function(){
613 UI.SuccessMessage("stop",2000)
614 list_href=[]
615 })
616
617 list_href=list_href.reverse();
618 console.log(list_href)
619 var list_data_reports=[]
620 var nr_reports=0;
621 var nr_reports_total=list_href.length
622 addWindow();
623 document.getElementById("progress_reports").innerText=nr_reports+"/"+nr_reports_total+" reports";
624 // UI.InfoMessage(nr_reports+"/"+nr_reports_total+" reports")
625 var current_url
626 async function ajaxRequest (urls) {
627 var time= 0
628 if(urls.length>0)
629 current_url=urls.pop().href;
630 else
631 current_url="stop"
632 console.log("inside function "+urls.length)
633 if (urls.length >= 0 && current_url!= "stop") {
634 var start_ajax=new Date()
635 $.ajax({
636 method: 'GET',
637 url: current_url,
638 })
639 .done(function (result) {
640 document.body.innerHTML= result;
641 result=null
642 // addWindow();
643 let list=getDataReport(tribemates);
644 console.log(list)
645 if(list==null ){
646 console.log("recaptcha, upload again")
647 UI.ErrorMessage("recaptcha, upload again","slow")
648 addWindow();
649 document.getElementById("progress_reports").innerText="recaptcha";
650 list_href=[]
651
652 }
653 else{
654 console.log("reports info "+list.length)
655 for(let j=0;j<list.length;j++){
656
657 if(document.getElementById("select_type_attacker")==null && !tribemates.includes(list[j].reportInfo.nameAttacker)){
658 let type=(list[j].reportInfo.typeAttacker!="?")?list[j].reportInfo.typeAttacker:"none"
659
660 console.log(type)
661 let htmlSelect='<select id="select_type_attacker" style="width: 100%">';
662 for(let k=types.length-1;k>=0;k--){
663 htmlSelect+='<option value="'+types[k]+'">'+types[k]+'</option>'
664 }
665 htmlSelect+='</select>';
666 $("#attack_info_att").append(htmlSelect)
667 document.getElementById("select_type_attacker").value=type
668 }
669 if(document.getElementById("select_type_defender")==null && !tribemates.includes(list[j].reportInfo.nameDefender)){
670 let type=(list[j].reportInfo.typeDefender!="?")?list[j].reportInfo.typeDefender:"none"
671 console.log(type)
672 let htmlSelect='<select id="select_type_defender" style="width: 100%">';
673 for(let k=types.length-1;k>=0;k--){
674 htmlSelect+='<option value="'+types[k]+'">'+types[k]+'</option>'
675 }
676 htmlSelect+='</select>';
677 $("#attack_info_def").append(htmlSelect)
678 document.getElementById("select_type_defender").value=type
679
680 }
681
682 }
683 // document.getElementById("progress_reports").innerText=nr_reports+"/"+nr_reports_total+" reports";
684 UI.SuccessMessage(nr_reports+"/"+nr_reports_total+" reports")
685
686 nr_reports++;
687 let idReport= parseInt(current_url.match(/view=(\d+)/)[1]);
688 let currentDate=new Date().getFullYear()+"-"+(new Date().getMonth()+1)+"-"+new Date().getDate();
689 if(document.getElementsByClassName("unit-item unit-item-axe").length>0){
690 var time_report=document.getElementsByClassName("vis")[3].firstElementChild.children[1].children[1].innerText;
691 map_idReports.set(idReport,time_report)
692 }
693 else{
694 map_idReports.set(idReport,currentDate)
695 }
696 }
697 var stop_ajax=new Date();
698 var dif_time=stop_ajax.getTime()-start_ajax.getTime();
699 console.log("dif_time "+dif_time+" wait "+(200-dif_time))
700
701 window.onkeyup = function(e) {
702 console.log(e.which)
703 if(e.which==13 && current_url!= "stop"){
704 console.log("next")
705 window.onkeyup = function(e){}
706
707 for(let j=0;j<list.length;j++){
708 if(document.getElementById("select_type_attacker")!=null){
709 let type=document.getElementById("select_type_attacker").value
710 if(type!="none"){
711 list[j].reportInfo.typeAttacker=type
712 list_data_reports.push({"coord":list[j].coord,"reportInfo":list[j].reportInfo});
713 }
714 }
715 if(document.getElementById("select_type_defender")!=null){
716 let type=document.getElementById("select_type_defender").value
717 if(type!="none"){
718 list[j].reportInfo.typeDefender=type
719 list_data_reports.push({"coord":list[j].coord,"reportInfo":list[j].reportInfo});
720 }
721 }
722
723 }
724 console.log("new list")
725 console.log(list)
726 console.log("big list")
727 console.log(list_data_reports)
728
729 window.setTimeout(function(){
730 ajaxRequest(list_href);
731 },200-dif_time)
732 }
733 e.preventDefault()
734 }
735 });
736
737 }
738 else
739 {
740 ////////////////////////////////////extract data from dropbox/////////////////////////////////////////
741 console.log("before reading map from dropbox")
742 var [map_dropbox, mapStatus]=await Promise.all([readFileDropbox(filename_reports) ,readFileDropbox(filname_status_upload)]).catch(err=>{alert(err)})
743 map_dropbox=new Map( JSON.parse( lzw_decode(map_dropbox)));
744 console.log("map_dropbox before",map_dropbox)
745
746 //clear map if contains data on tribe mates
747 let counterAttacker=0;
748 let counterDefender=0;
749 let counterTypAttacker=0;
750 let counterTypeDefender=0;
751 Array.from(map_dropbox.keys()).forEach(key=>{
752 try {
753 let obj=map_dropbox.get(key)
754 let obj_village=mapVillage.get(key)
755 if(key == obj.coordAttacker){
756 if(tribemates.includes(obj.nameAttacker.toLowerCase()) || obj.nameAttacker.toLowerCase() != obj_village.playerName.toLowerCase() ){
757 map_dropbox.delete(key)
758 counterAttacker++
759 }
760 else if(obj.typeAttacker=="?"){
761 map_dropbox.delete(key)
762 counterTypAttacker++
763 }
764
765
766
767 }
768 else if(key == obj.coordDefender){
769 if(tribemates.includes(obj.nameDefender.toLowerCase()) || obj.nameDefender.toLowerCase() != obj_village.playerName.toLowerCase() ){
770 map_dropbox.delete(key)
771 counterDefender++
772 }
773 else if(obj.typeDefender=="?"){
774 map_dropbox.delete(key)
775 counterTypeDefender++
776 }
777 }
778 } catch (error) {
779 console.log(error)
780 }
781 })
782 console.log("remove counterAttacker",counterAttacker)
783 console.log("remove counterDefender",counterDefender)
784 console.log("remove counterTypAttacker",counterTypAttacker)
785 console.log("remove counterTypeDefender",counterTypeDefender)
786
787 console.log("map_dropbox")
788 console.log(map_dropbox);
789 console.log("list_data_reports")
790 console.log(list_data_reports);
791
792
793 document.body.innerHTML= httpGet(current_page);
794 addWindow();
795 let nr_update=0;
796 let nr_write=0;
797 list_data_reports.forEach(function(el){
798 if(map_dropbox.has(el.coord)){//update el[0]=key
799 let obj_dropbox=map_dropbox.get(el.coord)
800
801 if(el.coord==el.reportInfo.coordAttacker){
802 console.log("update for offensive" && el.reportInfo.typeAttacker!="?")
803 if(el.reportInfo.typeAttacker=="new_off"){
804 console.log("new_off, don't do anything")
805 }else{
806 console.log("coord exists in dropbox already")
807 let time_prev=new Date(obj_dropbox.time_report);
808 let time_current=new Date(el.reportInfo.time_report);
809 console.log(time_current-time_prev)
810 if(time_current-time_prev<48*3600*1000 && (el.reportInfo.typeAttacker=="def" )){//48 hours
811 console.log("a fost def_cat")
812 map_dropbox.set(el.coord,{...obj_dropbox, ...el.reportInfo})
813 nr_update++;
814 }
815 else if(time_current-time_prev>0 ){
816 console.log("update coord: "+el.coord+" in dropbox")
817 map_dropbox.set(el.coord,{...obj_dropbox, ...el.reportInfo})
818 nr_update++;
819 }
820
821 }
822 }
823 if(el.coord==el.reportInfo.coordDefender && el.reportInfo.typeDefender!="?"){
824 console.log("update for defensive")
825 if(el.reportInfo.typeDefender=="new_off"){
826 console.log("new_off, don't do anything")
827 }else{
828 console.log("coord exists in dropbox already")
829 let time_prev=new Date(obj_dropbox.time_report);
830 let time_current=new Date(el.reportInfo.time_report);
831 console.log(time_current-time_prev)
832 if(time_current-time_prev<48*3600*1000 && (el.reportInfo.typeDefender=="def" )){//48 hours
833 console.log("a fost def_cat")
834 map_dropbox.set(el.coord,{...obj_dropbox, ...el.reportInfo})
835 nr_update++;
836 }
837 else if(time_current-time_prev>0 ){
838 console.log("update coord: "+el.coord+" in dropbox")
839 map_dropbox.set(el.coord,{...obj_dropbox, ...el.reportInfo})
840 nr_update++;
841 }
842
843 }
844 }
845 }
846 else{//write
847 if(el.coord==el.reportInfo.coordAttacker && el.reportInfo.typeAttacker!="?"){
848 console.log("write coord in dropbox")
849 map_dropbox.set(el.coord,el.reportInfo)
850 nr_write++;
851 }
852 else if(el.coord==el.reportInfo.coordDefender && el.reportInfo.typeDefender!="?"){
853 console.log("write coord in dropbox")
854 map_dropbox.set(el.coord,el.reportInfo)
855 nr_write++;
856 }
857 }
858 })
859
860 let serverTime=document.getElementById("serverTime").innerText
861 let serverDate=document.getElementById("serverDate").innerText.split("/")
862 serverDate=serverDate[1]+"/"+serverDate[0]+"/"+serverDate[2]
863 let date_current=new Date(serverDate+" "+serverTime)
864
865 //update status map
866 let obj_status={
867 name:game_data.player.name,
868 report_date:date_current,
869 }
870
871
872 if(mapStatus=="[]")
873 mapStatus=new Map()
874 else
875 mapStatus=new Map(JSON.parse(mapStatus))
876
877 if(mapStatus.has(game_data.player.id)){
878 let obj_update=mapStatus.get(game_data.player.id)
879 mapStatus.set(game_data.player.id, {...obj_update, ...obj_status} )
880 }
881 else{
882 mapStatus.set(game_data.player.id,obj_status)
883 }
884
885
886
887 UI.SuccessMessage("compressing database, wait few seconds",2000)
888
889 var nr_start=new Date().getTime()
890 var length_data=JSON.stringify(Array.from(map_dropbox.entries())).length;
891
892 var data=JSON.stringify(Array.from(map_dropbox.entries()))
893 data=replaceSpecialCaracters(data)
894 data=lzw_encode(data)
895 var length_data_compressed=data.length;
896
897 var nr_stop=new Date().getTime()
898 console.log("after")
899 console.log(map_dropbox)
900 console.log("compressing data: "+(nr_stop-nr_start))
901 console.log("length before: "+length_data+" length after compression: "+length_data_compressed)
902 console.log("compression factor: "+(length_data/length_data_compressed) )
903
904 let data_status=JSON.stringify(Array.from(mapStatus.entries()))
905
906 let result=await uploadFile(data,filename_reports,dropboxToken).catch(err=>alert(err))
907 let resultStatus=await uploadFile(data_status,filname_status_upload,dropboxToken).catch(err=>alert(err))
908
909 if(result=="succes")
910 console.log("status upload succesc")
911 else
912 console.log("status upload error")
913
914 localStorage.setItem(nameHistoryReports,JSON.stringify(Array.from(map_idReports.entries())))
915 console.log("save reports "+map_idReports.size)
916 document.getElementById("progress_reports").innerText="done";
917 window.setTimeout(()=>{
918 UI.SuccessMessage("upload reports done\n update: "+nr_update+" \nwrite: "+nr_write,2000)
919 },1000)
920
921
922
923
924 }
925 }
926 ajaxRequest(list_href);
927
928}
929///////////////////////////////////////////////////////////////////get all links////////////////////////////////////////////////////////////////
930function getLinks(all,map_idReports){
931
932 // var currentPage=document.body.innerHTML;
933 return new Promise((resolve,reject)=>{
934 let list_pages=[]
935 let current_href=window.location.href;
936 if(current_href.includes("screen=report"))
937 all=false;
938 if(all){// all pages from all folders
939 let href= game_data.link_base_pure+"report&mode=all&group_id=-1";
940 document.body.innerHTML=httpGet(href)
941 }
942 let page_size=parseInt(document.getElementsByName("page_size")[0].value)
943 if(document.getElementsByClassName("vis")[1].getElementsByTagName("select").length>0){
944 Array.from(document.getElementsByClassName("vis")[1].getElementsByTagName("select")[0]).forEach(function(item){
945 list_pages.push(item.value)
946 })
947 }
948 else if(document.getElementsByClassName("paged-nav-item").length>0){//all pages from the current folder
949 let length_page=document.getElementsByClassName("paged-nav-item").length
950 for(let i=0;i<length_page+1;i++){
951 let current=game_data.link_base_pure+`report&mode=all&from=${i*page_size}`
952 list_pages.push(current);
953
954 }
955 }
956 else{
957 let current_link=game_data.link_base_pure+`report&mode=all&from=0`
958 list_pages.push(current_link);
959 }
960 list_pages=list_pages.reverse();
961
962 console.log("list pages")
963 console.log(list_pages)
964
965 let list_href=[];
966 var indexIncoming=1;
967 var url_length=list_pages.length
968 function ajaxRequest (urls) {
969 let current_url
970
971 if(urls.length>0){
972 current_url=urls.pop()
973 }
974 else{
975 current_url="stop"
976 }
977 console.log("in functie in plm "+urls.length)
978 // console.log(current_url)
979 var start_ajax=new Date();
980 if (urls.length >= 0 && current_url!="stop") {
981 $.ajax({
982 url: current_url,
983 method: 'get',
984 success: (data) => {
985 document.body.innerHTML=data
986 let table_report= document.getElementById("report_list").firstElementChild.children;
987 let year=document.getElementById("serverDate").innerText.split("/")[2];
988 for(let i=1;i<table_report.length-1;i++){
989 let month_day=table_report[i].children[2].innerText;
990 let date_report=new Date(year+" "+month_day)
991 let current_date=new Date();
992 if(Math.abs(current_date-date_report)<19*24*3600*1000){//old
993
994 let img_icon=table_report[i].children[1].children[0].children.length;
995 if(img_icon>0){//wordsTranslate[0]=supports ///// || table_report[i].innerText.includes(wordsTranslate[0])
996 let obj={
997 id:table_report[i].getElementsByTagName("a")[0].getAttribute("data-id"),
998 href:table_report[i].getElementsByTagName("a")[0].href
999 }
1000 if(!map_idReports.has(parseInt(obj.id)))
1001 list_href.push(obj)
1002 }
1003 }
1004 }
1005
1006
1007 UI.InfoMessage("page "+indexIncoming+"/"+url_length)
1008 indexIncoming++;
1009 var stop_ajax=new Date();
1010 var dif_time=stop_ajax.getTime()-start_ajax.getTime();
1011 window.setTimeout(function(){
1012 ajaxRequest (list_pages)
1013 },200-dif_time)
1014 }
1015 })
1016
1017 }
1018 else
1019 {
1020 UI.SuccessMessage("done",2000)
1021 resolve(list_href)
1022 }
1023 }
1024 if(list_pages.length>0)
1025 ajaxRequest(list_pages);
1026 else
1027 reject("error??")
1028
1029 })
1030
1031}
1032
1033
1034
1035////////////////////////////////////////////////////////////get data from report////////////////////////////////////////////////////////////////////
1036
1037function getDataReport(tribemates){
1038 var mapObject={};
1039 var listObject=[];
1040
1041 // tribemates=[]
1042 var reportInfo={};
1043 try{
1044 if($("#attack_info_att").length>0){
1045 var attackInfo=$("#attack_info_att");
1046 if(attackInfo.text().includes("deleted") || attackInfo.text().includes("---")){
1047 console.log("error upload")
1048 return 0;
1049 }
1050 var defenseInfo = $("#attack_info_def");
1051 if(defenseInfo.text().includes("deleted") || defenseInfo.text().includes("---")){
1052 console.log("error upload")
1053 return 0;
1054 }
1055
1056 var attackingPlayer = attackInfo.find('a[href*=info_player]');
1057 var defendingPlayer = defenseInfo.find('a[href*=info_player]');
1058 var attackingPlayerId=attackingPlayer.prop('href').match(/id=(\w+)/)[1];
1059 var defendingPlayerId=defendingPlayer.prop('href').match(/id=(\w+)/)[1];
1060 reportInfo.attackingPlayerId=attackingPlayerId;
1061 reportInfo.defendingPlayerId=defendingPlayerId;
1062 }
1063 ///////////////////////////////////////////////////////////////////////////
1064
1065
1066 if(document.getElementsByClassName("unit-item unit-item-axe").length>1)
1067 {
1068 var time_report=document.getElementsByClassName("vis")[3].firstElementChild.children[1].children[1].innerText;
1069 // if(new Date()-new Date(time_report)>14*24*3600*1000)//report too old
1070 // return listObject;
1071 reportInfo.attackingArmy = attackInfo.find('#attack_info_att_units tr:nth-of-type(2) .unit-item').get().map((el) => { return { type: $(el).prop('class').match(/unit-item-([\w\-]+)/)[1], count: parseInt($(el).text().trim()) } })
1072 reportInfo.attackingArmyLosses = attackInfo.find('#attack_info_att_units tr:nth-of-type(3) .unit-item').get().map((el) => { return { type: $(el).prop('class').match(/unit-item-([\w\-]+)/)[1], count: parseInt($(el).text().trim()) } })
1073
1074 reportInfo.time_report=time_report
1075 var report=document.getElementsByClassName("vis")[3].innerHTML;
1076 var index=report.indexOf('<div class="no-preview">');
1077 report=report.substring(0,index);
1078 // report=lzw_encode(report);
1079 // reportInfo.report=report;
1080
1081 ///////////////////////////defender date////////////////////
1082 var nameAttacker=document.getElementById("attack_info_att").children[0].children[0].children[1].innerText;
1083 var coordAttacker=document.getElementsByClassName("village_anchor")[0].innerText.match(/[0-9]{3}\|[0-9]{3}/)[0];
1084 var nameDefender=document.getElementById("attack_info_def").children[0].children[0].children[1].innerText;
1085 var coordDefender=document.getElementsByClassName("village_anchor")[1].innerText.match(/[0-9]{3}\|[0-9]{3}/)[0];
1086 reportInfo.nameAttacker=nameAttacker;
1087 reportInfo.coordAttacker=coordAttacker;
1088 reportInfo.nameDefender=nameDefender;
1089 reportInfo.coordDefender=coordDefender;
1090
1091 if(reportInfo.attackingArmy[3].type=="archer"){
1092 var spear_atac_total =reportInfo.attackingArmy[0].count
1093 var sword_atac_total =reportInfo.attackingArmy[1].count
1094 var axe_atac_total =reportInfo.attackingArmy[2].count
1095 var archer_atac_total=reportInfo.attackingArmy[3].count
1096 var spy_atac_total =reportInfo.attackingArmy[4].count*2
1097 var light_atac_total =reportInfo.attackingArmy[5].count*4
1098 var heavy_atac_total =reportInfo.attackingArmy[7].count*6
1099 var ram_atac_total =reportInfo.attackingArmy[8].count*5
1100 var cat_atac_total =reportInfo.attackingArmy[9].count*8
1101 var noble=parseInt(document.getElementsByClassName("unit-item unit-item-snob")[0].innerText)*100;
1102
1103 var spear_atac_pierderi =reportInfo.attackingArmyLosses[0].count
1104 var sword_atac_pierderi =reportInfo.attackingArmyLosses[1].count
1105 var axe_atac_pierderi =reportInfo.attackingArmyLosses[2].count
1106 var archer_atac_pierderi=reportInfo.attackingArmyLosses[3].count
1107 var spy_atac_pierderi =reportInfo.attackingArmyLosses[4].count*2
1108 var light_atac_pierderi =reportInfo.attackingArmyLosses[5].count*4
1109 var heavy_atac_pierderi =reportInfo.attackingArmyLosses[7].count*6
1110 var ram_atac_pierderi =reportInfo.attackingArmyLosses[8].count*5
1111 var cat_atac_pierderi =reportInfo.attackingArmyLosses[9].count*8
1112 }
1113 else{
1114 var spear_atac_total=reportInfo.attackingArmy[0].count
1115 var sword_atac_total=reportInfo.attackingArmy[1].count
1116 var axe_atac_total =reportInfo.attackingArmy[2].count
1117 var spy_atac_total =reportInfo.attackingArmy[3].count*2
1118 var light_atac_total=reportInfo.attackingArmy[4].count*4
1119 var heavy_atac_total=reportInfo.attackingArmy[5].count*6
1120 var ram_atac_total =reportInfo.attackingArmy[6].count*5
1121 var cat_atac_total =reportInfo.attackingArmy[7].count*8
1122 var noble=parseInt(document.getElementsByClassName("unit-item unit-item-snob")[0].innerText)*100;
1123 var archer_atac_total=0;
1124
1125 var spear_atac_pierderi=reportInfo.attackingArmyLosses[0].count
1126 var sword_atac_pierderi=reportInfo.attackingArmyLosses[1].count
1127 var axe_atac_pierderi =reportInfo.attackingArmyLosses[2].count
1128 var spy_atac_pierderi =reportInfo.attackingArmyLosses[3].count*2
1129 var light_atac_pierderi=reportInfo.attackingArmyLosses[4].count*4
1130 var heavy_atac_pierderi=reportInfo.attackingArmyLosses[5].count*6
1131 var ram_atac_pierderi =reportInfo.attackingArmyLosses[6].count*5
1132 var cat_atac_pierderi =reportInfo.attackingArmyLosses[7].count*8
1133
1134 }
1135
1136
1137
1138 var typeAttacker="?";
1139 var nrTroupesAttacker=0;
1140 var nrTroupesAttackerTotal=0;
1141 var time_return=0;
1142
1143
1144 if(axe_atac_total+light_atac_total+ram_atac_total >=2500 && axe_atac_total>=2500)
1145 {
1146 typeAttacker="off";
1147 nrTroupesAttacker=(axe_atac_total-axe_atac_pierderi)+(light_atac_total-light_atac_pierderi) + (ram_atac_total-ram_atac_pierderi);
1148 console.log("ianinte")
1149 if(ram_atac_total>0 && noble==0 && axe_atac_total>=2000){
1150 console.log("aici")
1151 nrTroupesAttackerTotal=axe_atac_total+light_atac_total+ram_atac_total
1152 let time_attack=ramSpeed*calcDistance(coordAttacker,coordDefender)
1153 time_return=new Date(time_report).getTime()+time_attack;
1154 time_return=new Date(time_return)
1155 let date=new Date(time_return).toDateString().split(" ").slice(1).join(" ")
1156 time_return=date+" "+new Date(time_return).toTimeString().split(" ")[0]
1157
1158 }else if(axe_atac_total>=2000 && noble==0 ){
1159 nrTroupesAttackerTotal=axe_atac_total+light_atac_total
1160 time_attack=axeSpeed*calcDistance(coordAttacker,coordDefender)
1161 time_return=new Date(time_report).getTime()+time_attack;
1162 time_return=new Date(time_return)
1163 let date=new Date(time_return).toDateString().split(" ").slice(1).join(" ")
1164 time_return=date+" "+new Date(time_return).toTimeString().split(" ")[0]
1165
1166 }else if(axe_atac_total>=2000 && noble>0){
1167 nrTroupesAttackerTotal=axe_atac_total+light_atac_total+ram_atac_total
1168 time_attack=axeSpeed*calcDistance(coordAttacker,coordDefender)
1169 time_return=new Date(time_report).getTime()+time_attack;
1170 time_return=new Date(time_return)
1171 let date=new Date(time_return).toDateString().split(" ").slice(1).join(" ")
1172 time_return=date+" "+new Date(time_return).toTimeString().split(" ")[0]
1173 }
1174 }
1175 else if(spy_atac_total>6000){
1176 typeAttacker="spy";
1177 nrTroupesAttacker=spy_atac_total-spy_atac_pierderi;
1178 }
1179 else if(axe_atac_total+light_atac_total+ram_atac_total >20 && spear_atac_total+sword_atac_total+archer_atac_total+heavy_atac_total<15)
1180 {
1181 typeAttacker="new_off";
1182 }
1183 else if(axe_atac_total+light_atac_total+ram_atac_total <15 && spear_atac_total+sword_atac_total+archer_atac_total+heavy_atac_total>15){
1184 typeAttacker="def";
1185 }
1186 else if(spy_atac_total>=800 && axe_atac_total+light_atac_total+ram_atac_total<500 && spear_atac_total+sword_atac_total+archer_atac_total+heavy_atac_total<40){
1187 typeAttacker="def_spy";
1188 }
1189 else if(spear_atac_total + sword_atac_total + archer_atac_total > 1000){
1190 typeAttacker="def";
1191 }
1192
1193
1194
1195
1196
1197 if((cat_atac_total>=50*8 && typeAttacker=="def") || (cat_atac_total>=50*8 && axe_atac_total+light_atac_total+ram_atac_total<20)){
1198 typeAttacker="def_cat";
1199 nrTroupesAttacker=cat_atac_total-cat_atac_pierderi;
1200 if(noble==0){
1201 nrTroupesAttackerTotal=heavy_atac_total+cat_atac_total
1202 time_attack=ramSpeed*calcDistance(coordAttacker,coordDefender)
1203 time_return=new Date(time_report).getTime()+time_attack;
1204 time_return=new Date(time_return)
1205 let date=new Date(time_return).toDateString().split(" ").slice(1).join(" ")
1206 time_return=date+" "+new Date(time_return).toTimeString().split(" ")[0]
1207 }
1208 }
1209
1210 reportInfo.time_return=time_return
1211 reportInfo.nrTroupesAttackerTotal=nrTroupesAttackerTotal
1212 reportInfo.typeAttacker=typeAttacker;
1213 reportInfo.nrTroupesAttacker=nrTroupesAttacker;
1214
1215
1216
1217 /////////////////////////////////////////////////defender date/////////////////////
1218 var nrTroupesDefender=0;
1219 var typeDefender="?";
1220 if(document.getElementsByClassName("unit-item unit-item-axe").length>2){
1221
1222 reportInfo.defendingArmy = defenseInfo.find('#attack_info_def_units tr:nth-of-type(2) .unit-item').get().map((el) => { return { type: $(el).prop('class').match(/unit-item-([\w\-]+)/)[1], count: parseInt($(el).text().trim()) } })
1223 reportInfo.defendingArmyLosses = defenseInfo.find('#attack_info_def_units tr:nth-of-type(3) .unit-item').get().map((el) => { return { type: $(el).prop('class').match(/unit-item-([\w\-]+)/)[1], count: parseInt($(el).text().trim()) } })
1224
1225 let armyAtHome=[]
1226
1227 for(let i=0;i<reportInfo.defendingArmy.length;i++){
1228 armyAtHome.push({
1229 type:reportInfo.defendingArmy[i].type,
1230 count:reportInfo.defendingArmy[i].count-reportInfo.defendingArmyLosses[i].count
1231 })
1232 }
1233 reportInfo["troopsAtHome_"+coordDefender]=armyAtHome
1234 reportInfo["time_report_home_"+coordDefender]=time_report
1235
1236
1237 if(reportInfo.defendingArmy[3].type=="archer"){
1238 var spear_aparare_total =reportInfo.defendingArmy[0].count
1239 var sword_aparare_total =reportInfo.defendingArmy[1].count
1240 var axe_aparare_total =reportInfo.defendingArmy[2].count
1241 var archer_aparare_total=reportInfo.defendingArmy[3].count
1242 var spy_aparare_total =reportInfo.defendingArmy[4].count*2
1243 var light_aparare_total =reportInfo.defendingArmy[5].count*4
1244 var heavy_aparare_total =reportInfo.defendingArmy[7].count*6
1245 var ram_aparare_total =reportInfo.defendingArmy[8].count*5
1246 var cat_aparare_total =reportInfo.defendingArmy[9].count*8
1247
1248 var spear_aparare_pierderi =reportInfo.defendingArmyLosses[0].count
1249 var sword_aparare_pierderi =reportInfo.defendingArmyLosses[1].count
1250 var axe_aparare_pierderi =reportInfo.defendingArmyLosses[2].count
1251 var archer_aparare_pierderi=reportInfo.defendingArmyLosses[3].count
1252 var spy_aparare_pierderi =reportInfo.defendingArmyLosses[4].count*2
1253 var light_aparare_pierderi =reportInfo.defendingArmyLosses[5].count*4
1254 var heavy_aparare_pierderi =reportInfo.defendingArmyLosses[7].count*6
1255 var ram_aparare_pierderi =reportInfo.defendingArmyLosses[8].count*5
1256 var cat_aparare_pierderi =reportInfo.defendingArmyLosses[9].count*8
1257
1258 }
1259 else{
1260 var spear_aaparare_total=reportInfo.defendingArmy[0].count
1261 var sword_aparare_total =reportInfo.defendingArmy[1].count
1262 var axe_aparare_total =reportInfo.defendingArmy[2].count
1263 var spy_aparare_total =reportInfo.defendingArmy[3].count*2
1264 var light_aparare_total =reportInfo.defendingArmy[4].count*4
1265 var heavy_aparare_total =reportInfo.defendingArmy[5].count*6
1266 var ram_aparare_total =reportInfo.defendingArmy[6].count*5
1267 var cat_aparare_total =reportInfo.defendingArmy[7].count*8
1268 var archer_aparare_total=0;
1269
1270 var spear_aaparare_pierderi=reportInfo.defendingArmyLosses[0].count
1271 var sword_aparare_pierderi =reportInfo.defendingArmyLosses[1].count
1272 var axe_aparare_pierderi =reportInfo.defendingArmyLosses[2].count
1273 var spy_aparare_pierderi =reportInfo.defendingArmyLosses[3].count*2
1274 var light_aparare_pierderi =reportInfo.defendingArmyLosses[4].count*4
1275 var heavy_aparare_pierderi =reportInfo.defendingArmyLosses[5].count*6
1276 var ram_aparare_pierderi =reportInfo.defendingArmyLosses[6].count*5
1277 var cat_aparare_pierderi =reportInfo.defendingArmyLosses[7].count*8
1278 var archer_aparare_pierderi=0;
1279
1280 }
1281
1282
1283
1284 nrTroupesDefender=(axe_aparare_total-axe_aparare_pierderi)+(light_aparare_total-light_aparare_pierderi) + (ram_aparare_total-ram_aparare_pierderi);
1285 if(axe_aparare_total+light_aparare_total+ram_aparare_total >=2500 && axe_aparare_total>=2500){
1286 typeDefender="off";
1287 }
1288
1289
1290 }
1291
1292 if(document.getElementsByClassName("unit-item unit-item-axe").length>4){
1293 let travelingTroopsContainer = $(document).find('#attack_spy_away');
1294 if (travelingTroopsContainer.length)
1295 {
1296 reportInfo.travelingTroops = {};
1297
1298 travelingTroopsContainer.find('.unit-item').each((i, el) => {
1299 let $el = $(el);
1300 let cls = $el.prop('class');
1301 let unitType = cls.match(/unit\-item\-(\w+)/)[1];
1302 reportInfo.travelingTroops[unitType] = parseInt($el.text().trim());
1303 });
1304
1305 var axe_aparare_spy=reportInfo.travelingTroops.axe
1306 var light_aparare_spy=reportInfo.travelingTroops.light*4;
1307 var ram_aparare_spy=reportInfo.travelingTroops.ram*5;
1308 nrTroupesDefender+=axe_aparare_spy+(light_aparare_spy) + (ram_aparare_spy);
1309
1310 if(axe_aparare_total+axe_aparare_spy>2500)
1311 typeDefender="off";
1312 else if(nrTroupesDefender>=2500 && axe_aparare_spy>=2500)
1313 typeDefender="off";
1314 else{
1315 var spear_aparare_spy=reportInfo.travelingTroops.spear
1316 var sword_aparare_spy=reportInfo.travelingTroops.sword
1317 if(document.getElementsByClassName("unit-item unit-item-archer").length>0)
1318 var archer_aparare_spy=reportInfo.travelingTroops.archer
1319 else
1320 var archer_aparare_spy=0
1321
1322 var heavy_aparare_spy=reportInfo.travelingTroops.heavy*6;
1323 var trupe_aparare_total=spear_aparare_total+sword_aparare_total+archer_aparare_total+heavy_aparare_total;
1324 var total_aparare_spy=spear_aparare_spy+sword_aparare_spy+archer_aparare_spy+heavy_aparare_spy;
1325
1326 if(total_aparare_spy>1000){
1327 typeDefender="def";
1328 nrTroupesDefender=total_aparare_spy;
1329 }
1330 else if(axe_aparare_spy+light_aparare_spy <10 && axe_aparare_total+light_aparare_total<100 && trupe_aparare_total>5000 && total_aparare_spy<=1000){
1331 typeDefender="def??";
1332 }
1333 }
1334 }
1335
1336 }
1337 reportInfo.typeDefender=typeDefender;
1338 reportInfo.nrTroupesDefender=nrTroupesDefender;
1339
1340
1341
1342 if(!tribemates.includes(nameAttacker.toLowerCase()) && !reportInfo.typeAttacker.includes("?") ){//!reportInfo.typeAttacker.includes("?")
1343 // console.log("attacker")
1344 mapObject.coord=coordAttacker;
1345 mapObject.reportInfo=reportInfo;
1346 listObject.push(mapObject);
1347 mapObject={};
1348 }
1349 if(!tribemates.includes(nameDefender.toLowerCase()) && !reportInfo.typeDefender.includes("?")){
1350 // console.log("defender")
1351 mapObject.coord=coordDefender;
1352 mapObject.reportInfo=reportInfo;
1353 listObject.push(mapObject);
1354 }
1355 }
1356 else if(document.getElementsByClassName("unit-item unit-item-axe").length==1)
1357 {
1358 var typeSupporter="?";
1359 var nrTroupesSupporter=0;
1360 let time_report=document.getElementsByClassName("vis")[3].firstElementChild.children[1].children[1].innerText;
1361 if(new Date()-new Date(time_report)>14*3600*1000)//report too old
1362 return listObject;
1363 var report=document.getElementsByClassName("vis")[3].innerHTML;
1364 // report=lzw_encode(report);
1365 reportInfo.time_report=time_report;
1366 // reportInfo.report=report;
1367
1368 var text=document.getElementsByClassName("vis")[3].innerText.split("\n");
1369 var nameSupporter=text[3].split(":")[1].trim();
1370 var coordSupporter=text[4].split(":")[1].trim().match(/[0-9]{3}\|[0-9]{3}/)[0];
1371 var supporterPlayerId=document.getElementsByClassName("vis")[3].getElementsByTagName("a")[1].href.split("id=")[1]
1372 // var supporterPlayerId=document.getElementsByClassName("village_anchor contexted")[0].getAttribute("data-player")
1373
1374 reportInfo.nameSupporter=nameSupporter;
1375 reportInfo.coordSupporter=coordSupporter;
1376 reportInfo.supporterPlayerId=supporterPlayerId;
1377
1378
1379 var axe_total=parseInt(document.getElementsByClassName("unit-item unit-item-axe")[0].innerText);
1380 var light_total=parseInt(document.getElementsByClassName("unit-item unit-item-light")[0].innerText)*4;
1381 var ram_total=parseInt(document.getElementsByClassName("unit-item unit-item-ram")[0].innerText)*5;
1382
1383 var spear_total=parseInt(document.getElementsByClassName("unit-item unit-item-spear")[0].innerText);
1384 var sword_total=parseInt(document.getElementsByClassName("unit-item unit-item-sword")[0].innerText);
1385 var archer_total=parseInt(document.getElementsByClassName("unit-item unit-item-archer")[0].innerText);
1386 var heavy_total=parseInt(document.getElementsByClassName("unit-item unit-item-heavy")[0].innerText)*6;
1387
1388 var total_atac=axe_total+light_total+ram_total;
1389 var total_aparare=spear_total+sword_total+archer_total+heavy_total;
1390
1391 if(total_atac>total_aparare && total_atac>=200){
1392 typeSupporter="off";
1393 nrTroupesSupporter=total_atac;
1394 }
1395 else if(total_aparare>total_atac && total_aparare>=200){
1396 typeSupporter="def";
1397 nrTroupesSupporter=total_aparare;
1398 }
1399 reportInfo.typeSupporter=typeSupporter;
1400 reportInfo.nrTroupesSupporter=nrTroupesSupporter;
1401
1402 if(!tribemates.includes(nameSupporter) && !reportInfo.typeSupporter.includes("?")){
1403 // console.log("supporter")
1404 mapObject.coord=coordSupporter;
1405 mapObject.reportInfo=reportInfo;
1406 listObject.push(mapObject);
1407 }
1408 }
1409 else if(document.getElementsByClassName("unit-item unit-item-axe").length==0 || document.getElementsByClassName("g-recaptcha").length>0
1410 ||document.getElementsByClassName("unit-item unit-item-axe")==undefined || checkContainsCaptcha(document)==true){//recaptcha
1411 console.log("recapthca")
1412 return null;
1413 }
1414
1415 return listObject;
1416 }
1417 catch(e){
1418 console.log("erorr in upload")
1419 return 0;
1420 }
1421
1422}
1423
1424function checkContainsCaptcha(docOrHtml) {
1425 var foundCaptcha = false;
1426 if (typeof docOrHtml == 'string') {
1427 foundCaptcha = !!docOrHtml.match(/data\-bot\-protect=/);
1428 } else {
1429 let $doc = $(docOrHtml);
1430 let $body = $doc.find('#ds_body');
1431 foundCaptcha = $body.length && !!$body.data('bot-protect')
1432 }
1433
1434 if (foundCaptcha) console.log('Found captcha!');
1435 return foundCaptcha;
1436}
1437
1438function calcDistance(coord1,coord2){
1439 let x1=parseInt(coord1.split("|")[0])
1440 let y1=parseInt(coord1.split("|")[1])
1441 let x2=parseInt(coord2.split("|")[0])
1442 let y2=parseInt(coord2.split("|")[1])
1443
1444 return Math.sqrt( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) );
1445}
1446
1447////////////////////////////////////////////////data compression////////////////////////////////////////////////////////////////////////////
1448function lzw_encode (s) {
1449 if (!s) return s;
1450 var dict = new Map(); // Use a Map!
1451 var data = (s + "").split("");
1452 var out = [];
1453 var currChar;
1454 var phrase = data[0];
1455 var code = 256;
1456 for (var i = 1; i < data.length; i++) {
1457 currChar = data[i];
1458 if (dict.has(phrase + currChar)) {
1459 phrase += currChar;
1460 } else {
1461 out.push (phrase.length > 1 ? dict.get(phrase) : phrase.codePointAt(0));
1462 dict.set(phrase + currChar, code);
1463 code++;
1464 if (code === 0xd800) { code = 0xe000; }
1465 phrase = currChar;
1466 }
1467 }
1468 out.push (phrase.length > 1 ? dict.get(phrase) : phrase.codePointAt(0));
1469 for (var i = 0; i < out.length; i++) {
1470 out[i] = String.fromCodePoint(out[i]);
1471 }
1472 //console.log ("LZW MAP SIZE", dict.size, out.slice (-50), out.length, out.join("").length);
1473 return out.join("");
1474}
1475////////////////////////////////////////////////data decompression////////////////////////////////////////////////////////////////////////////
1476function lzw_decode (s) {
1477 var dict = new Map(); // Use a Map!
1478 var data = Array.from(s + "");
1479 //var data = (s + "").split("");
1480 var currChar = data[0];
1481 var oldPhrase = currChar;
1482 var out = [currChar];
1483 var code = 256;
1484 var phrase;
1485 for (var i = 1; i < data.length; i++) {
1486 var currCode = data[i].codePointAt(0);
1487 if (currCode < 256) {
1488 phrase = data[i];
1489 } else {
1490 phrase = dict.has(currCode) ? dict.get(currCode) : (oldPhrase + currChar);
1491 }
1492 out.push(phrase);
1493 var cp = phrase.codePointAt(0);
1494 currChar = String.fromCodePoint(cp); //phrase.charAt(0);
1495 dict.set(code, oldPhrase + currChar);
1496 code++;
1497 if (code === 0xd800) { code = 0xe000; }
1498 oldPhrase = phrase;
1499 }
1500 return out.join("");
1501}
1502///////////////////////////////////////////////////////get request//////////////////////////////////////////////////////////////////////////
1503function httpGet(theUrl){
1504 var xmlHttp = new XMLHttpRequest();
1505 xmlHttp.open( "GET", theUrl, false ); // false for synchronous request
1506 xmlHttp.send( null );
1507 return xmlHttp.responseText;
1508}
1509
1510
1511///////////////////////////////////////////////////////get speed//////////////////////////////////////////////////////////////////////////
1512
1513
1514///////////////////////////////////////////////////////get all incomings//////////////////////////////////////////////////////////////////////////
1515
1516function getIncomings(){
1517 return new Promise( (resolve,reject)=>{
1518
1519 if(document.getElementsByClassName("info").length>0)
1520 $(".info").remove()
1521 var current_href_incomings=window.location.href;
1522 let incomings_href= game_data.link_base_pure+"overview_villages&mode=incomings&type=all&subtype=attacks&group=0&page=-1";
1523
1524 console.log("currentLink")
1525 console.log(incomings_href)
1526 document.body.innerHTML=httpGet(incomings_href);
1527 let list_href=[];
1528 if(document.getElementsByClassName("vis")[1].getElementsByTagName("select").length>0){
1529 Array.from(document.getElementsByClassName("vis")[1].getElementsByTagName("select")[0].options).forEach(el=>{
1530 list_href.push(el.value);
1531 })
1532 list_href.pop();
1533 }
1534 else if(document.getElementsByClassName("paged-nav-item").length>0){
1535 let arr=Array.from(document.getElementsByClassName("paged-nav-item"));
1536 for(let i=0;i<arr.length;i++)
1537 list_href.push(arr[i].getAttribute("href"))
1538 }
1539 else{
1540 list_href.push(incomings_href)
1541
1542 }
1543 if(document.getElementById("incomings_table")==null)
1544 throw new Error("you don't have any incomings");
1545
1546 console.log(list_href)
1547 let incomings_data=new Map();
1548
1549
1550 var indexIncoming=1;
1551 var url_length=list_href.length
1552 var start_ajax=new Date();
1553 function ajaxRequest (urls) {
1554 let current_url
1555 var time=0
1556 if(urls.length>0){
1557 current_url=urls.pop()
1558 }
1559 else{
1560 current_url="stop"
1561 }
1562 console.log("in functie in plm "+urls.length)
1563 // console.log(current_url)
1564
1565 if (urls.length >= 0 && current_url!="stop") {
1566 $.ajax({
1567 url: current_url,
1568 method: 'get',
1569 success: (data) => {
1570 document.body.innerHTML=data
1571 if(document.getElementById("incomings_table")==null)
1572 alert("turn off the filters");
1573 let table_incomings=document.getElementById("incomings_table").getElementsByTagName("tbody")[0].children
1574 for(let i=1;i<table_incomings.length-1;i++){
1575 if(table_incomings[i].children[0].innerText!="--"){
1576 let coord_def=table_incomings[i].children[1].innerText.match(/[0-9]{3}\|[0-9]{3}/)[0]
1577 let coord_off=table_incomings[i].children[2].innerText.match(/[0-9]{3}\|[0-9]{3}/)[0]
1578 let length_tr=table_incomings[i].children.length
1579 let time_land=table_incomings[i].children[length_tr-2].innerText
1580
1581 let player_off=table_incomings[i].children[length_tr-4].innerText
1582 let player_def=game_data.player.name
1583
1584 let id_player_def=game_data.player.id
1585 let id_player_off=table_incomings[i].children[length_tr-4].getElementsByTagName("a")[0].href.split("id=")[1]
1586
1587 let id_coord_def=table_incomings[i].children[2].getElementsByTagName("a")[0].href.split("village=")[1].split("&")[0]
1588 let id_coord_off=table_incomings[i].children[2].getElementsByTagName("a")[0].href.split("id=")[1]
1589
1590
1591 let server_date=document.getElementById("serverDate").innerText.split("/")
1592 let date_land=getLandTime(time_land)
1593 let labelName="none"
1594 let type_attack=table_incomings[i].getElementsByClassName("quickedit")[0].getElementsByTagName("img")[0].src.split("command/")[1]
1595 if(table_incomings[i].children[0].getElementsByTagName("img").length==2){
1596 labelName=table_incomings[i].getElementsByClassName("quickedit")[0].getElementsByTagName("img")[1].src.split("tiny/")[1]
1597 if(labelName==undefined)
1598 labelName=table_incomings[i].getElementsByClassName("quickedit")[0].getElementsByTagName("img")[1].src.split("command/")[1]
1599
1600 }
1601
1602
1603
1604 // console.log(date_land)
1605 if(!incomings_data.has(coord_off)){
1606 let list=[{
1607 date_land:date_land,
1608 coord_def:coord_def,
1609 coord_off:coord_off,
1610 player_off:player_off,
1611 player_def:player_def,
1612 labelName:labelName,
1613 type_attack:type_attack,
1614 id_player_def:id_player_def,
1615 id_player_off:id_player_off,
1616 id_coord_def:id_coord_def,
1617 id_coord_off:id_coord_off
1618 }]
1619 incomings_data.set(coord_off,list)
1620
1621 }else{
1622 let list=incomings_data.get(coord_off)
1623 list.push({
1624 date_land:date_land,
1625 coord_def:coord_def,
1626 coord_off:coord_off,
1627 player_off:player_off,
1628 player_def:player_def,
1629 labelName:labelName,
1630 type_attack:type_attack,
1631 id_player_def:id_player_def,
1632 id_player_off:id_player_off,
1633 id_coord_def:id_coord_def,
1634 id_coord_off:id_coord_off
1635 })
1636 incomings_data.set(coord_off,list)
1637 }
1638 }
1639 }
1640
1641 UI.InfoMessage(indexIncoming+"/"+url_length)
1642 indexIncoming++;
1643 var stop_ajax=new Date();
1644 var dif_time=stop_ajax.getTime()-start_ajax.getTime()
1645 window.setTimeout(function(){
1646 ajaxRequest (list_href)
1647 },200)
1648 }
1649 })
1650
1651 }
1652 else
1653 {
1654 UI.SuccessMessage("done",2000)
1655 if(document.getElementById("incomings_table")!=null){
1656 // showButtons();
1657 }
1658
1659 if( document.getElementsByClassName("g-recaptcha").length>0){//recaptcha
1660 console.log("recapthca")
1661 UI.ErrorMessage("recapthca, upload again")
1662 resolve(null);
1663 }
1664
1665 window.setTimeout(function(){
1666 document.body.innerHTML=httpGet(current_href_incomings);
1667 console.log(incomings_data)
1668 resolve(incomings_data)
1669 },1000+Math.random()*500)
1670
1671
1672
1673 }
1674 }
1675 if(list_href.length>0)
1676 ajaxRequest(list_href);
1677 else
1678 reject("error on incomings")
1679 })
1680}
1681///////////////////////////////////////////////////////upload all incomings//////////////////////////////////////////////////////////////////////////
1682
1683async function uploadIncomings(){
1684
1685 var [incomings_data, map_incomings_dropbox,mapStatus]=await Promise.all([getIncomings(), readFileDropbox(filename_incomings),readFileDropbox(filname_status_upload)]).catch(err=>{alert(err)})
1686 map_incomings_dropbox=new Map(JSON.parse(lzw_decode(map_incomings_dropbox)))
1687
1688 return new Promise(async(resolve,reject)=>{
1689 let keys_dropbox=Array.from(map_incomings_dropbox.keys());
1690
1691 let server_date=document.getElementById("serverDate").innerText.split("/")
1692 let server_time=document.getElementById("serverTime").innerText
1693 let current_date=new Date(server_date[1]+"/"+server_date[0]+"/"+server_date[2]+" "+server_time);
1694 /////////////////////////////////eliminate old incomings from dropbox////////////////////////////////////
1695 let start=new Date();
1696 keys_dropbox.forEach(el=>{
1697 let list=map_incomings_dropbox.get(el);
1698 let update=false;
1699 for(let i=0;i<list.length;i++){
1700 let date_incomings=new Date(list[i].date_land)
1701 // console.log(date_incomings<current_date)
1702 if(date_incomings<current_date){
1703 list.splice(i,1);
1704 i--;
1705 update=true;
1706 }
1707 if(list[i]==""){
1708 list.splice(i,1);
1709 update=true;
1710 }
1711
1712 }
1713 if(update==true || list.length==0){
1714 if(list.length==0)
1715 map_incomings_dropbox.delete(el);
1716 else{
1717 map_incomings_dropbox.set(el,list);
1718 }
1719 }
1720 })
1721 console.log(map_incomings_dropbox)
1722 let stop=new Date();
1723 console.log(stop-start)
1724
1725 let keys_incomings=Array.from(incomings_data.keys());
1726 keys_incomings.forEach(el=>{
1727 let list=incomings_data.get(el)
1728 if(map_incomings_dropbox.has(el)){//update
1729 let list_dropbox=map_incomings_dropbox.get(el)
1730 list_dropbox=list_dropbox.concat(list);
1731 var list_concat =[...new Map(list_dropbox.map(item => [item["date_land"], item])).values()]
1732 map_incomings_dropbox.set(el,list_concat);
1733 }
1734 else{//add
1735 map_incomings_dropbox.set(el,list);
1736 }
1737 })
1738
1739 let serverTime=document.getElementById("serverTime").innerText
1740 let serverDate=document.getElementById("serverDate").innerText.split("/")
1741 serverDate=serverDate[1]+"/"+serverDate[0]+"/"+serverDate[2]
1742 let date_current=new Date(serverDate+" "+serverTime)
1743
1744 //update status map
1745 let obj_status={
1746 name:game_data.player.name,
1747 incoming_date:date_current,
1748 }
1749 if(mapStatus=="[]")
1750 mapStatus=new Map()
1751 else
1752 mapStatus=new Map(JSON.parse(mapStatus))
1753
1754 if(mapStatus.has(game_data.player.id)){
1755 let obj_update=mapStatus.get(game_data.player.id)
1756 mapStatus.set(game_data.player.id, {...obj_update, ...obj_status} )
1757 }
1758 else{
1759 mapStatus.set(game_data.player.id,obj_status)
1760 }
1761
1762
1763
1764 console.log(map_incomings_dropbox)
1765 UI.SuccessMessage("compressing database, wait few seconds",2000)
1766 var data=JSON.stringify(Array.from(map_incomings_dropbox.entries()))
1767 data=replaceSpecialCaracters(data);
1768 data=lzw_encode(data)
1769
1770 let data_status=JSON.stringify(Array.from(mapStatus.entries()))
1771 // document.body.innerHTML=httpGet(current_href_incomings);
1772 addWindow();
1773 showButtons();
1774 document.getElementById("progress_incomings").innerText=incomings_data.size+" coords";
1775 document.getElementById("progress_all").innerText="done";
1776 UI.SuccessMessage("upload incomings done","slow")
1777 let result=await uploadFile(data,filename_incomings,dropboxToken)
1778 let resultStatus=await uploadFile(data_status,filname_status_upload,dropboxToken).catch(err=>alert(err))
1779 if(result=="succes")
1780 resolve("succes")
1781 else
1782 reject("error")
1783
1784 })
1785}
1786
1787
1788
1789//////////////////////////////////////////////////////upload all data to dropbox/////////////////////////////////////////////////////////////////
1790
1791function uploadFile(data,filename,dropboxToken){
1792 return new Promise((resolve,reject)=>{
1793 var file = new Blob([data], {type: "plain/text"});
1794 var nr_start1=new Date().getTime();
1795 file.name=filename;
1796
1797 //stop refreshing the page
1798 $(document).bind("keydown", disableF5);
1799 window.onbeforeunload = function (e) {
1800 console.log("is uploading");
1801 return "are you sure?";
1802 };
1803
1804 var xhr = new XMLHttpRequest();
1805 xhr.upload.onprogress = function(evt) {
1806 console.log(evt)
1807 var percentComplete = parseInt(100.0 * evt.loaded / evt.total);
1808 console.log(percentComplete)
1809 UI.SuccessMessage("progress upload: "+percentComplete+"%")
1810 };
1811
1812 xhr.onload = function() {
1813 if (xhr.status === 200) {
1814 var fileInfo = JSON.parse(xhr.response);
1815 // Upload succeeded. Do something here with the file info.
1816 UI.SuccessMessage("upload succes")
1817 var nr_stop1=new Date().getTime();
1818 console.log("time upload: "+(nr_stop1-nr_start1))
1819
1820 //enable refresh page
1821 window.onbeforeunload = function (e) {
1822 console.log("done");
1823 };
1824 $(document).unbind("keydown", disableF5);
1825
1826 resolve("succes")
1827
1828 }
1829 else {
1830 var errorMessage = xhr.response || 'Unable to upload file';
1831 // Upload failed. Do something here with the error.
1832 UI.SuccessMessage("upload failed")
1833 reject(errorMessage)
1834 }
1835 };
1836
1837 xhr.open('POST', 'https://content.dropboxapi.com/2/files/upload');
1838 xhr.setRequestHeader('Authorization', 'Bearer ' + dropboxToken);
1839 xhr.setRequestHeader('Content-Type', 'application/octet-stream');
1840 xhr.setRequestHeader('Dropbox-API-Arg', JSON.stringify({
1841 path: '/' + file.name,
1842 mode: 'add',
1843 autorename: true,
1844 mode:'overwrite',
1845 mute: false
1846 }));
1847
1848 xhr.send(file)
1849 })
1850}
1851
1852///////////////////////////////////////////////////////read files//////////////////////////////////////////////////////////////////////////
1853
1854function readFileDropbox(filename){
1855 return new Promise((resolve,reject)=>{
1856 $.ajax({
1857 url: "https://content.dropboxapi.com/2/files/download",
1858 method: 'POST',
1859 dataType: "text",
1860 headers: { 'Authorization': 'Bearer ' + dropboxToken,
1861 'Dropbox-API-Arg': JSON.stringify({path: "/"+filename})},
1862
1863 success: (data) => {
1864 resolve(data)
1865 },error: (err)=>{
1866 console.log(err)
1867 reject(err)
1868 }
1869 })
1870 })
1871}
1872
1873
1874
1875function replaceSpecialCaracters(data){
1876 let result=""
1877 for(let i=0;i<data.length;i++){
1878 if(data[i]=="ț")
1879 result+='t'
1880 else if(data[i]=="Ț")
1881 result+="T"
1882 else if(data[i]=="Ă")
1883 result+="A"
1884 else if(data[i]=="ă")
1885 result+="a"
1886 else if(data[i]=="Â")
1887 result+="A"
1888 else if(data[i]=="Ș")
1889 result+="S"
1890 else if(data[i]=="ș")
1891 result+="s"
1892 else if(data[i]=="Î")
1893 result+="I"
1894 else if(data[i]=="î")
1895 result+="i"
1896 else
1897 result+=data[i]
1898 }
1899 return result
1900
1901
1902
1903
1904}
1905
1906function disableF5(e) { if ((e.which || e.keyCode) == 116 || (e.which || e.keyCode) == 82) e.preventDefault(); };
1907
1908
1909//////////////////////////////////////////////////////buttons in incomings page/////////////////////////////////////////////////////////////////
1910
1911
1912function showButtons(){
1913 if(document.getElementById("incomings_table")!=null){
1914 $("#table_incomings").remove();
1915 var incomingshtml=`
1916
1917 <table id="table_incomings" class="" border="1" style="width: 50%;">
1918 <tbody>
1919 <tr>
1920 <td style="text-align:center; width:auto;">
1921 <center style="margin:10px"><u><input class="btn" type="button" onclick="addWindow()"value="open upload"></center>
1922 </td>
1923
1924 <td style="text-align:center; width:auto;">
1925 <center style="margin:10px"><u><input class="btn" type="button" onclick="moreInfo()" value="more info"></center>
1926 </td>
1927 <td style="text-align:center; width:auto;">
1928 <center style="margin:10px"><u><input class="btn" id="btn_tag" type="button" onclick="tagIncomings()" value="tag"></center>
1929 </td>
1930 <td style="text-align:center; width:auto;">
1931 <center style="margin:10px"><u><input class="btn" type="button" onclick="setIntervalIncomings()" value="get incomings"></center>
1932 </td>
1933 <td style="text-align:center; width:auto;">
1934 <center style="margin:10px"><u><input id="btn_highlight" class="btn" type="button" onclick="toggleHighLight()" value="highlight"></center>
1935 </td>
1936 </tr>
1937 </tbody>
1938 </table>
1939 </div>`
1940 // $(".vis").eq(3).append(incomingshtml)
1941 $(".overview_filters").before(incomingshtml)
1942
1943 var link = document.createElement('link');
1944 link.id = "style_popup";
1945 link.rel = 'stylesheet';
1946 link.type = 'text/css';
1947 link.href = 'https://dl.dropboxusercontent.com/s/ki0zhogjf0705c3/style_popup.css';
1948 link.media = 'all';
1949 document.getElementsByTagName('head')[0].appendChild(link);
1950 }
1951
1952
1953
1954
1955}
1956showButtons();
1957
1958//////////////////////////////////////////////////////show info in incomings page/////////////////////////////////////////////////////////////////
1959
1960async function moreInfo(){
1961 $("#div_container").remove();
1962 $(".deleteTh").remove();
1963
1964 console.log("inainte")
1965 var [map_reports_dropbox, map_incomings_dropbox]=await Promise.all([readFileDropbox(filename_reports), readFileDropbox(filename_incomings)]).catch(err=>{alert(err)})
1966 map_reports_dropbox=new Map(JSON.parse(lzw_decode(map_reports_dropbox)))
1967 map_incomings_dropbox=new Map(JSON.parse(lzw_decode(map_incomings_dropbox)))
1968 UI.SuccessMessage("get data",1000)
1969
1970 console.log("get incomings")
1971 $(".tr_delimitator").remove();
1972 console.log(map_incomings_dropbox)
1973 if(document.getElementsByClassName("info").length>0)
1974 $(".info").remove()
1975 else{
1976 let start=new Date();
1977
1978
1979 // let table=document.getElementById("incomings_table").lastElementChild.children
1980 let incomings_table=document.getElementById("incomings_table").cloneNode(true)
1981 let table=incomings_table.lastElementChild.children
1982 let list=[];
1983 let map_nr_atacuri=new Map();
1984 let map_nr_destination=new Map();
1985
1986 //adaugare o noua coloana
1987 let coloana_nr=table[0].insertCell(3);
1988 coloana_nr.outerHTML="<th class='deleteTh'><a href=# id='id_nr'> nr</a></th>";
1989 coloana_nr.className="info"
1990
1991 let coloana_tribe=table[0].insertCell(4);
1992 coloana_tribe.outerHTML="<th class='deleteTh'><a href=# id='id_nr_tr'> nr_tribe</a></th>";
1993 coloana_tribe.className="info"
1994
1995 let coloana_type=table[0].insertCell(5);
1996 coloana_type.outerHTML="<th class='deleteTh'><a href=# id='id_type'> type</a></th>";
1997 coloana_type.className="info"
1998
1999 let coloana_pop=table[0].insertCell(6);
2000 coloana_pop.outerHTML="<th class='deleteTh'><a href=# id='id_pop'>pop</a></th>";
2001 coloana_pop.className="info"
2002
2003 let coloana_time=table[0].insertCell(7);
2004 coloana_time.outerHTML="<th class='deleteTh'><a href=# id='id_time'>time</a></th>";
2005 coloana_time.className="info"
2006
2007 let coloana_report=table[0].insertCell(8);
2008 coloana_report.outerHTML="<th class='deleteTh'><a href=# id='id_report'>report</a></th>";
2009 coloana_report.className="info"
2010
2011 var list_coord_player=[]
2012 for(let i=1;i<table.length-1;i++){
2013 let coord=table[i].children[2].innerText.match(/[0-9]{3}\|[0-9]{3}/)[0];
2014 let coord_destination=table[i].children[1].innerText.match(/[0-9]{3}\|[0-9]{3}/)[0];
2015 let player_id=table[i].children[table[i].children.length-4].children[0].href.split("player&id=")[1]
2016 list_coord_player.push({
2017 coord:coord,
2018 player_id:player_id
2019 })
2020 //origin coord
2021 if(map_nr_atacuri.has(coord))
2022 map_nr_atacuri.set(coord,parseInt(map_nr_atacuri.get(coord)) +1);
2023 else
2024 map_nr_atacuri.set(coord,1);
2025 //destination coord
2026 if(map_nr_destination.has(coord_destination))
2027 map_nr_destination.set(coord_destination,parseInt(map_nr_destination.get(coord_destination)) +1);
2028 else
2029 map_nr_destination.set(coord_destination,1);
2030 }
2031 var stop=new Date();
2032 console.log("add info: "+(stop-start))
2033
2034 for(let i=1;i<table.length-1;i++){
2035 var html_nr="?"
2036 var html_nr_tribe="<center>0</center>"
2037 var html_type="?"
2038 var html_pop="?"
2039 var html_time="?"
2040 var html_report="?"
2041
2042 var length_tr=table[i].children.length
2043 let coord=list_coord_player[i-1].coord
2044 let player_id=list_coord_player[i-1].player_id
2045 let coord_destination=table[i].children[1].innerText.match(/[0-9]{3}\|[0-9]{3}/)[0];
2046 let duplicate_destination=map_nr_destination.get(coord_destination)
2047 table[i].children[1].setAttribute("data-nr",duplicate_destination)
2048
2049
2050 html_nr="<h4>"+map_nr_atacuri.get(coord)+"</h4>";
2051
2052
2053 if(map_incomings_dropbox.has(coord)){
2054 let list_incomings=map_incomings_dropbox.get(coord)
2055 // html_nr_tribe=" <center><h4 style='color:black'>"+list_incomings.length+"</h4></center>";
2056 console.log(list_incomings)
2057 list_incomings.sort((o1,o2)=>{
2058 return (new Date(o1.date_land).getTime()<new Date(o2.date_land).getTime())?1:
2059 (new Date(o1.date_land).getTime()>new Date(o2.date_land).getTime())?-1:0
2060 })
2061 html_nr_tribe=`
2062 <div class="popup" onclick='var popup = document.getElementById("tableInc`+i+`");popup.classList.toggle("show")'><center><h4 style='color:black'>${list_incomings.length}</h4></center>
2063 <table class="popuptext" border="1" style="background-color:#f4e4bc;border-color:#c1a264" id="tableInc`+i+'"'+
2064 createTableIncomings(list_incomings)+
2065 '</table></div>';
2066
2067
2068
2069
2070 }
2071 if(map_reports_dropbox.has(coord) )
2072 {
2073 let idPlayer_dropbox
2074 let type_dropbox
2075 let nr_troupes_dropbox
2076
2077 var obj=map_reports_dropbox.get(coord);
2078 var traveling=false
2079 if(coord == obj.coordAttacker){
2080 idPlayer_dropbox=obj.attackingPlayerId;
2081 type_dropbox=obj.typeAttacker;
2082 nr_troupes_dropbox=obj.nrTroupesAttacker
2083 traveling=true;
2084 }
2085 else if(coord == obj.coordDefender){
2086 idPlayer_dropbox=obj.defendingPlayerId;
2087 type_dropbox=obj.typeDefender;
2088 nr_troupes_dropbox=obj.nrTroupesDefender
2089 traveling=false;
2090 }
2091 else{
2092 idPlayer_dropbox=obj.supporterPlayerId
2093 type_dropbox=obj.typeSupporter;
2094 nr_troupes_dropbox=obj.nrTroupesSupporter
2095 }
2096
2097 if(idPlayer_dropbox == player_id)
2098 {
2099 let date_start=new Date(obj.time_report);
2100 let date_stop=new Date();
2101 let days=("00"+parseInt((date_stop-date_start)/(24*3600*1000))).slice(-3);
2102 let hours=("0"+parseInt((date_stop-date_start)/(3600*1000)%24)).slice(-2);
2103 let minutes=("0"+parseInt(((date_stop-date_start)/(60*1000)%60))).slice(-2);
2104 let seconds=( "0"+parseInt((((date_stop-date_start)/1000)%60))).slice(-2);
2105
2106 //calculate population
2107 let date_landing_report=new Date(obj.time_report)
2108 let distance=parseFloat(table[i].children[length_tr-3].innerText);
2109 let time_attack=0;
2110 let time_land=table[i].children[length_tr-2].innerText
2111 let date_land=new Date(getLandTime(time_land))
2112 let labelName=""
2113 if(table[i].children[0].getElementsByTagName("img")[1]==undefined || table[i].children[0].getElementsByTagName("img")[1]==null )
2114 labelName="ram.png"
2115 else
2116 labelName=table[i].children[0].getElementsByTagName("img")[1].src
2117
2118 if(labelName.includes("snob.png")){
2119 time_attack=nobleSpeed*distance
2120 }else if(labelName.includes("ram.png") || labelName.includes("catapult.png")){
2121 time_attack=ramSpeed*distance
2122 }else if(labelName.includes("sword.png")){
2123 time_attack=swordSpeed*distance
2124 }else if(labelName.includes("axe.png")){
2125 time_attack=axeSpeed *distance
2126 }
2127 if(traveling==false)
2128 time_attack=0;
2129
2130 if(type_dropbox=="off"){
2131 // console.log(date_land.getTime())
2132 // console.log(time_attack)
2133 // console.log(date_landing_report.getTime())
2134 let timeForRecruiting = (date_land.getTime()-time_attack)-date_landing_report.getTime()
2135 nr_troupes_dropbox=calcProductionTroupes(timeForRecruiting,nr_troupes_dropbox)
2136 nr_troupes_dropbox=Math.round(nr_troupes_dropbox*10)/10+"%"
2137 // console.log("final "+nr_troupes_dropbox)
2138 }
2139 else{
2140 nr_troupes_dropbox="?"
2141 }
2142
2143
2144 html_type=" <h4 class='cls_type'>"+type_dropbox+"</h4>"
2145 html_pop=" <h4 class='cls_pop'>"+nr_troupes_dropbox+"</h4>"
2146 if(obj.time_return==0 || obj.time_return==undefined){
2147 html_time=" <h4>"+days+":"+hours+":"+minutes+":"+seconds+"</h4>";
2148 }
2149 else{
2150 html_time=" <h4 class='possible_fake' date-fake='"+obj.time_return+"'>"+days+":"+hours+":"+minutes+":"+seconds+"</h4>";
2151 }
2152
2153 // createTableIncomings
2154 // console.log(obj)
2155 html_report=`
2156 <div class="popup" onclick='var popup = document.getElementById("table`+i+`");popup.classList.toggle("show")'><h4>show</h4>
2157 <table class="popuptext" style="background-color:#f4e4bc" id="table`+i+'"'+
2158 createReport(obj)+
2159 '</table></div>';
2160 }
2161 }
2162 coloana_nr=table[i].insertCell(3);
2163 coloana_nr.innerHTML=html_nr
2164 coloana_nr.className="info test"
2165
2166 coloana_tribe=table[i].insertCell(4);
2167 coloana_tribe.innerHTML=html_nr_tribe
2168 coloana_tribe.className="info"
2169
2170 coloana_type=table[i].insertCell(5);
2171 coloana_type.innerHTML=html_type
2172 coloana_type.className="info"
2173
2174 coloana_pop=table[i].insertCell(6);
2175 coloana_pop.innerHTML=html_pop
2176 coloana_pop.className="info"
2177
2178 coloana_time=table[i].insertCell(7);
2179 coloana_time.innerHTML=html_time
2180 coloana_time.className="info"
2181
2182 coloana_report=table[i].insertCell(8);
2183 coloana_report.innerHTML=html_report
2184 coloana_report.className="info"
2185 }
2186 console.log(incomings_table)
2187 $("#incomings_table tbody tr").remove()
2188 $("#incomings_table tbody").append(table)
2189 sortIncomings();
2190 highLightIncomings();
2191 counterTime();
2192 var stop=new Date();
2193 console.log("add inf final: "+(stop-start))
2194
2195
2196 $('document').ready(function() {
2197 CommandsOverview.init();
2198 UI.ToolTip('.icon_village_notes');
2199
2200 $('.quickedit').QuickEdit({url: TribalWars.buildURL('POST', 'info_command', {ajaxaction: 'edit_other_comment', id: '__ID__'})});
2201 Command.init();
2202 });
2203
2204
2205 }
2206
2207
2208}
2209
2210//////////////////////////////////////////////////////sort incomings by.. /////////////////////////////////////////////////////////////////
2211
2212function sortIncomings()
2213{
2214 var table=document.getElementById("incomings_table").lastElementChild.children;
2215 var new_table=document.getElementById("incomings_table").lastElementChild;
2216 var last_row=table[table.length-1];
2217 var list=[];
2218 var list_info=[]
2219 for(let i=1;i<table.length-1;i++){
2220 if(table[i].classList.contains("row_a")){
2221 table[i].classList.remove("row_a")
2222 table[i].classList.add("row_b")
2223 }
2224 if(table[i].classList.contains("selected")){
2225 table[i].classList.remove("selected")
2226 }
2227
2228 list.push(table[i]);
2229 }
2230 var length_table=1
2231 if(table.length>2){
2232 length_table=table[1].children.length
2233 }
2234
2235
2236 //sort by nr
2237 document.getElementById("id_nr").addEventListener("click",function()
2238 {
2239 var start=new Date();
2240 $(".tr_delimitator").remove();
2241 list.sort( (a,b)=>{
2242 return (parseInt(a.children[3].innerText)<parseInt(b.children[3].innerText))?1:(parseInt(a.children[3].innerText)>parseInt(b.children[3].innerText))?-1:
2243 (a.children[2].innerText<b.children[2].innerText) ? 1: (a.children[2].innerText>b.children[2].innerText)?-1:0;
2244 });
2245
2246
2247 //add new table in page
2248 for(let i=0;i<list.length;i++)
2249 {
2250 new_table.appendChild(list[i]);
2251 }
2252 new_table.appendChild(last_row);
2253
2254 for(let i=0;i<list.length;i++)
2255 {
2256 list_info.push({
2257 coord_attacker:list[i].children[2].innerText,
2258 nr:parseInt(list[i].children[3].innerText),
2259 })
2260 }
2261 var pozitie=2;
2262 for(let i=0;i<list.length-1;i++)
2263 {
2264 let nr_atacuri=list_info[i].nr
2265 if(nr_atacuri>1 && list_info[i].coord_attacker !=list_info[i+1].coord_attacker)
2266 {
2267 var tableRef = document.getElementById("incomings_table").lastElementChild;
2268 var newRow = tableRef.insertRow(pozitie);
2269 newRow.className="tr_delimitator"
2270 for(let i=0; i<1;i++){
2271 let cell = newRow.insertCell();
2272 cell.setAttribute("colspan",length_table)
2273 cell.classList.add("selected")
2274 var delimitator = document.createTextNode('--');
2275 cell.appendChild(delimitator);
2276
2277 }
2278 pozitie++;
2279 }
2280 else if(nr_atacuri==1){
2281 break;
2282 }
2283 pozitie++;
2284 }
2285 list_info=[]
2286 var stop=new Date();
2287 console.log(stop-start)
2288 })
2289
2290 //sort by nr tribe
2291 document.getElementById("id_nr_tr").addEventListener("click",function()
2292 {
2293 var start=new Date();
2294
2295 $(".tr_delimitator").remove();
2296 list.sort( (a,b)=>{
2297 return (parseInt(a.children[4].innerText)<parseInt(b.children[4].innerText))?1:(parseInt(a.children[4].innerText)>parseInt(b.children[4].innerText))?-1:
2298 (a.children[2].innerText<b.children[2].innerText) ? 1: (a.children[2].innerText>b.children[2].innerText)?-1:0;
2299 });
2300
2301
2302 //add new table in page
2303 for(let i=0;i<list.length;i++)
2304 {
2305 new_table.appendChild(list[i]);
2306 }
2307 new_table.appendChild(last_row);
2308
2309 for(let i=0;i<list.length;i++)
2310 {
2311 list_info.push({
2312 coord_attacker:list[i].children[2].innerText,
2313 nr:parseInt(list[i].children[4].innerText),
2314 })
2315 }
2316 var pozitie=2;
2317 for(let i=0;i<list.length-1;i++)
2318 {
2319 let nr_atacuri=list_info[i].nr
2320 if(nr_atacuri>1 && list_info[i].coord_attacker !=list_info[i+1].coord_attacker)
2321 {
2322 var tableRef = document.getElementById("incomings_table").lastElementChild;
2323 var newRow = tableRef.insertRow(pozitie);
2324 newRow.className="tr_delimitator"
2325 for(let i=0; i<1;i++){
2326 let cell = newRow.insertCell();
2327 cell.setAttribute("colspan",length_table)
2328 cell.classList.add("selected")
2329 var delimitator = document.createTextNode('--');
2330 cell.appendChild(delimitator);
2331
2332 }
2333 pozitie++;
2334 }
2335 else if(nr_atacuri==1){
2336 break;
2337 }
2338 pozitie++;
2339 }
2340 list_info=[]
2341 var stop=new Date();
2342 console.log(stop-start)
2343 })
2344
2345
2346 //sort by type
2347 document.getElementById("id_type").addEventListener("click",function()
2348 {
2349 var start=new Date();
2350 $(".tr_delimitator").remove();
2351 list.sort( (a,b)=>{
2352 return (a.children[5].innerText<b.children[5].innerText)?1:(a.children[5].innerText>b.children[5].innerText)?-1:
2353 (a.children[2].innerText<b.children[2].innerText) ? 1: (a.children[2].innerText>b.children[2].innerText)?-1:0;
2354 });
2355
2356 //add new table in page
2357 for(let i=0;i<list.length;i++)
2358 {
2359 new_table.appendChild(list[i]);
2360 }
2361 new_table.appendChild(last_row);
2362
2363 var pozitie=2;
2364 for(let i=0;i<list.length-1;i++)
2365 {
2366 let type=list[i].children[5].innerText;
2367 if(type!="?" && list[i].children[5].innerText !=list[i+1].children[5].innerText)
2368 {
2369 var tableRef = document.getElementById("incomings_table").lastElementChild;
2370 var newRow = tableRef.insertRow(pozitie);
2371 newRow.className="tr_delimitator"
2372 for(let i=0; i<1;i++){
2373 let cell = newRow.insertCell();
2374 cell.setAttribute("colspan",length_table)
2375 cell.classList.add("selected")
2376 var delimitator = document.createTextNode('--');
2377 cell.appendChild(delimitator);
2378 }
2379 pozitie++;
2380 }
2381 pozitie++;
2382 }
2383 list_info=[]
2384 var stop=new Date();
2385 console.log(stop-start)
2386 })
2387
2388 //sort by nr pop
2389 document.getElementById("id_pop").addEventListener("click",function()
2390 {
2391 var start=new Date();
2392 console.log("aici baaaa")
2393 console.log($(".tr_delimitator"))
2394 $(".tr_delimitator").remove();
2395 list.sort( (a,b)=>{
2396 if(a.children[6].innerText=="?")
2397 var a_comp=2000000;
2398 else
2399 var a_comp=parseFloat(a.children[6].innerText);
2400
2401 if(b.children[6].innerText=="?")
2402 var b_comp=2000000;
2403 else
2404 var b_comp=parseFloat(b.children[6].innerText);
2405
2406 return (a_comp>b_comp)?1:(a_comp<b_comp)?-1:
2407 (a.children[2].innerText<b.children[2].innerText) ? 1: (a.children[2].innerText>b.children[2].innerText)?-1:0;
2408 });
2409
2410 //add new table in page
2411 for(let i=0;i<list.length;i++)
2412 {
2413 new_table.appendChild(list[i]);
2414 }
2415 list_info=[]
2416 new_table.appendChild(last_row);
2417
2418 let pozitie=1
2419 for(let i=0;i<list.length;i++)
2420 {
2421 console.log(i)
2422 if(i%4==0 && i>0){
2423 console.log("inside "+i)
2424 var tableRef = document.getElementById("incomings_table").lastElementChild;
2425 var newRow = tableRef.insertRow(pozitie);
2426 newRow.className="tr_delimitator"
2427 for(let i=0; i<1;i++){
2428 let cell = newRow.insertCell();
2429 cell.setAttribute("colspan",length_table)
2430 cell.classList.add("selected")
2431 var delimitator = document.createTextNode('--');
2432 cell.appendChild(delimitator);
2433 }
2434 pozitie++;
2435
2436 }
2437 pozitie++;
2438 }
2439
2440
2441
2442
2443 var stop=new Date();
2444 console.log(stop-start)
2445 })
2446
2447 //sort by time
2448 document.getElementById("id_time").addEventListener("click",function()
2449 {
2450 var start=new Date();
2451
2452 $(".tr_delimitator").remove();
2453
2454 list.sort( (a,b)=>{
2455 if(a.children[7].innerText=="?")
2456 var a_comp=10000000000;
2457 else{
2458 var v=a.children[7].innerText.split(":");
2459 var a_comp=parseInt(v[0])*24*3600+parseInt(v[1])*3600 +parseInt(v[2])*60 +parseInt(v[3]);
2460 }
2461
2462 if(b.children[7].innerText=="?")
2463 var b_comp=10000000000;
2464 else{
2465 var v=b.children[7].innerText.split(":");
2466 var b_comp=parseInt(v[0])*24*3600+parseInt(v[1])*3600 +parseInt(v[2])*60 +parseInt(v[3]);
2467 }
2468
2469 return (a_comp>b_comp)?1:(a_comp<b_comp)?-1:
2470 (a.children[2].innerText<b.children[2].innerText) ? 1: (a.children[2].innerText>b.children[2].innerText)?-1:0;
2471 });
2472
2473 //add new table in page
2474 for(let i=0;i<list.length;i++)
2475 {
2476 new_table.appendChild(list[i]);
2477 }
2478 list_info=[]
2479 new_table.appendChild(last_row);
2480
2481 let pozitie=1
2482 for(let i=0;i<list.length;i++)
2483 {
2484 console.log(i)
2485 if(i%4==0 && i>0){
2486 console.log("inside "+i)
2487 var tableRef = document.getElementById("incomings_table").lastElementChild;
2488 var newRow = tableRef.insertRow(pozitie);
2489 newRow.className="tr_delimitator"
2490 for(let i=0; i<1;i++){
2491 let cell = newRow.insertCell();
2492 cell.setAttribute("colspan",length_table)
2493 cell.classList.add("selected")
2494 var delimitator = document.createTextNode('--');
2495 cell.appendChild(delimitator);
2496 }
2497 pozitie++;
2498
2499 }
2500 pozitie++;
2501 }
2502
2503
2504 var stop=new Date();
2505 console.log(stop-start)
2506 })
2507
2508 //sort by coord destination
2509 var destination_th=document.getElementById("incomings_table").lastElementChild.children[0].children[1]
2510 destination_th=destination_th.getElementsByTagName("a")[0]
2511 destination_th.outerHTML="<a href='#' id='nr_dest'>"+destination_th.innerHTML+"</a>"
2512
2513 document.getElementById("nr_dest").addEventListener("click",function()
2514 {
2515 console.log("aici")
2516 var start=new Date();
2517 let lengthTr=list[0].children.length
2518 $(".tr_delimitator").remove();
2519 list.sort( (a,b)=>{
2520 return (new Date(getLandTime(a.children[lengthTr-2].innerText)).getTime()>new Date(getLandTime(b.children[lengthTr-2].innerText)).getTime())?1:
2521 (new Date(getLandTime(a.children[lengthTr-2].innerText)).getTime()<new Date(getLandTime(b.children[lengthTr-2].innerText)).getTime())?-1:0
2522 })
2523 list.sort( (a,b)=>{
2524 return (parseInt(a.children[1].getAttribute("data-nr"))<parseInt(b.children[1].getAttribute("data-nr")))?1:
2525 (parseInt(a.children[1].getAttribute("data-nr"))>parseInt(b.children[1].getAttribute("data-nr")))?-1:
2526 (a.children[1].innerText<b.children[1].innerText) ? 1: (a.children[1].innerText>b.children[1].innerText)?-1:0;
2527 });
2528
2529
2530 //add new table in page
2531 for(let i=0;i<list.length;i++)
2532 {
2533 new_table.appendChild(list[i]);
2534 }
2535 new_table.appendChild(last_row);
2536 //
2537 for(let i=0;i<list.length;i++)
2538 {
2539 list_info.push({
2540 coord_deff:list[i].children[1].innerText.match(/[0-9]{3}\|[0-9]{3}/)[0],
2541 nr:parseInt(list[i].children[1].getAttribute("data-nr")),
2542 id_coord:list[i].children[1].children[0].href.split("village=")[1].split("&")[0]
2543 })
2544 }
2545 console.log(list_info)
2546
2547 //add delimiter on the first row
2548 var tableRef = document.getElementById("incomings_table").lastElementChild;
2549 var newRow = tableRef.insertRow(1);
2550 newRow.className="tr_delimitator"
2551 let cell = newRow.insertCell();
2552
2553 cell.setAttribute("colspan",length_table)
2554 cell.classList.add("selected")
2555 var delimitator = document.createElement("button")
2556 delimitator.innerText="load: ("+list_info[0].coord_deff+")"
2557 delimitator.setAttribute("data-id",list_info[0].id_coord)
2558 delimitator.setAttribute("data-nr",list_info[0].nr)
2559 delimitator.style.margin="10px"
2560 delimitator.classList.add("btn","load_troops")
2561 cell.appendChild(delimitator);
2562
2563 //add delimiter after each village destination
2564 var pozitie=3;
2565 for(let i=0;i<list.length-1;i++)
2566 {
2567 if(list_info[i].coord_deff !=list_info[i+1].coord_deff)
2568 {
2569 var tableRef = document.getElementById("incomings_table").lastElementChild;
2570 var newRow = tableRef.insertRow(pozitie);
2571 newRow.className="tr_delimitator"
2572 let cell = newRow.insertCell();
2573
2574 cell.setAttribute("colspan",length_table)
2575 cell.classList.add("selected")
2576 var delimitator = document.createElement("button")
2577 delimitator.innerText="load: ("+list_info[i+1].coord_deff+")"
2578 delimitator.setAttribute("data-id",list_info[i+1].id_coord)
2579 delimitator.setAttribute("data-nr",list_info[i+1].nr)
2580 delimitator.style.margin="10px"
2581 delimitator.classList.add("btn","load_troops")
2582 cell.appendChild(delimitator);
2583
2584
2585 pozitie++;
2586 }
2587 pozitie++;
2588 }
2589 list_info=[]
2590 var stop=new Date();
2591 console.log(stop-start)
2592 eventGetTroops();
2593 })
2594
2595
2596}
2597
2598//////////////////////////////////////////////////////tag incomings /////////////////////////////////////////////////////////////////
2599function tagIncomings(){
2600
2601 if(document.getElementsByClassName("info").length==0){
2602 UI.ErrorMessage("press first the button 'more info'!")
2603 }
2604 else{
2605 $("#btn_tag").attr('disabled', true);
2606 $(".tr_delimitator").remove();
2607 let csrf = window.csrf_token;
2608 var list_incomings_href=[]
2609 var indexIncoming=1;
2610 var table_incomings=document.getElementById("incomings_table").children[1].children
2611
2612 var nobleSpeed=2100*1000/(speedWorld*speedTroupes)//ms
2613 var ramSpeed=1800*1000/(speedWorld*speedTroupes)//ms
2614 var swordSpeed=1260*1000/(speedWorld*speedTroupes)//ms
2615 var axeSpeed=1080*1000/(speedWorld*speedTroupes)//ms
2616
2617 var map_tagged=localStorage.getItem(game_data.world+"map_tagged")
2618 if(map_tagged!=undefined)
2619 map_tagged=new Map(JSON.parse(lzw_decode(map_tagged)))
2620 else
2621 map_tagged=new Map()
2622
2623 let list_incomingId=[]
2624 for(let i=1;i<table_incomings.length-1;i++){
2625 let incomingId=table_incomings[i].children[0].children[2].getAttribute("data-id");
2626 let coordOrigin=table_incomings[i].children[2].innerText.match(/[0-9]{3}\|[0-9]{3}/)[0];
2627 let href=window.location.href.split("&")[0]+`&screen=info_command&ajaxaction=edit_other_comment&id=${incomingId}&h=${csrf}`
2628 let current_tag=table_incomings[i].children[0].innerText.trim()
2629 var nameTroupe=table_incomings[i].children[0].innerText.trim().split(/\s+/)[0];
2630 let nr=parseInt(table_incomings[i].children[3].innerText);
2631 let nr_tribe=table_incomings[i].children[4].innerText;
2632 let type=table_incomings[i].children[5].innerText;
2633 let pop= (table_incomings[i].children[6].innerText !="?")?parseInt(table_incomings[i].children[6].innerText):"?"
2634 let time=table_incomings[i].children[7].innerText;
2635 let length_tr=table_incomings[i].children.length
2636 let nameAttacker=table_incomings[i].children[length_tr-4].innerText
2637 ////////////////////////////////get land time///////////////////////////////
2638 let time_land=table_incomings[i].children[length_tr-2].innerText
2639 let date_land=getLandTime(time_land)
2640 let fake=false;
2641
2642 list_incomingId.push(incomingId)
2643
2644
2645 if(table_incomings[i].getElementsByClassName("possible_fake").length>0 && table_incomings[i].getElementsByClassName("quickedit")[0].getElementsByTagName("img").length==2){
2646 let date_home=new Date(table_incomings[i].getElementsByClassName("possible_fake")[0].getAttribute("date-fake"))
2647 let distance=parseFloat(table_incomings[i].children[length_tr-3].innerText);
2648 let labelName=table_incomings[i].getElementsByClassName("quickedit")[0].getElementsByTagName("img")[1].src
2649 let time_attack=0;
2650 if(labelName.includes("snob.png")){
2651 time_attack=nobleSpeed*distance
2652 }else if(labelName.includes("ram.png") || labelName.includes("catapult.png")){
2653 time_attack=ramSpeed*distance
2654 }else if(labelName.includes("sword.png")){
2655 time_attack=swordSpeed*distance
2656 }else if(labelName.includes("axe.png")){
2657 time_attack=axeSpeed *distance
2658 }
2659
2660 let dateLand=new Date(date_land)
2661 console.log(time_attack)
2662 if(time_attack+date_home.getTime()>dateLand.getTime() ){
2663 fake=true;
2664 console.log("fake from "+coordOrigin)
2665 }
2666 var days=parseInt(time.split(":")[0])*24*3600*1000
2667 var hours=parseInt(time.split(":")[1])*3600*1000
2668 var min=parseInt(time.split(":")[2])*60*1000
2669 var sec=parseInt(time.split(":")[3])*1000
2670 var total_time=days+hours+min+sec-time_attack
2671 time=total_time/(24*3600*1000)
2672 time+=":00:00:00"
2673 }
2674
2675 let obj={
2676 incomingId:incomingId,
2677 coordOrigin:coordOrigin,
2678 href:href,
2679 nameTroupe:nameTroupe,
2680 nr:nr,
2681 nr_tribe:nr_tribe,
2682 type:type,
2683 pop:pop,
2684 time:time,
2685 nameAttacker:nameAttacker,
2686 fake:fake,
2687 current_tag:current_tag,
2688 }
2689 if(!table_incomings[i].children[0].innerText.toLowerCase().includes(wordsTranslate[4]) && !table_incomings[i].children[0].innerText.toLowerCase().includes('"'))
2690 list_incomings_href.push(obj)
2691 }
2692 list_incomings_href=list_incomings_href.reverse();
2693
2694 //eliminate old incomingId
2695 console.log(list_incomingId)
2696 Array.from(map_tagged.keys()).forEach((key)=>{
2697 if(!list_incomingId.includes(key)){
2698 map_tagged.delete(key)
2699 console.log("delete id: "+key)
2700 }
2701 })
2702
2703
2704 var url_length=list_incomings_href.length
2705 var start_tagging=new Date()
2706 function ajaxRequest (urls) {
2707 let current_url
2708 let labelInfo=""
2709 let current_tag
2710 let obj=null
2711 if(urls.length>0){
2712 obj=urls.pop()
2713 current_url=obj.href;
2714 labelInfo=obj.nameTroupe;
2715 current_tag=obj.current_tag;
2716 let nr
2717 if(obj.nr_tribe=="?")
2718 nr=parseInt(obj.nr)
2719 else{
2720 nr=Math.max(parseInt(obj.nr), parseInt(obj.nr_tribe) )
2721 }
2722
2723 if(obj.type!="?"){
2724 obj.time=parseInt(obj.time.split(":")[0]);
2725
2726 if(obj.nr==20000)
2727 labelInfo=labelInfo+" "+obj.nameAttacker+" "+nr+" "+obj.type;
2728 else if(obj.type=="new_off")
2729 labelInfo=labelInfo+" "+obj.nameAttacker+" "+nr+" off";
2730 else if(obj.type.includes("def"))
2731 labelInfo=labelInfo+" "+obj.nameAttacker+" "+nr+" "+obj.type+" "+obj.time+"d";
2732 else
2733 labelInfo=labelInfo+" "+obj.nameAttacker+" "+nr+" "+obj.type+" "+obj.pop+"% "+obj.time+"d"
2734 // if(obj.nr==20000)
2735 // labelInfo=labelInfo+" "+obj.nameAttacker+" "+nr+" "+obj.type;
2736 // else if(obj.type=="new_off")
2737 // labelInfo=labelInfo+" "+obj.nameAttacker+" "+nr+" off";
2738 // else if(obj.type.includes("def"))
2739 // labelInfo=labelInfo+" "+obj.nameAttacker+" "+nr+" "+obj.type
2740 // else
2741 // labelInfo=labelInfo+" "+obj.nameAttacker+" "+nr+" "+obj.type
2742
2743
2744
2745
2746 }
2747 else{
2748 labelInfo=labelInfo+" "+obj.nameAttacker+" "+nr
2749 }
2750 if(obj.fake==true){
2751 labelInfo+=' ("fake")';
2752 }
2753 // console.log(labelInfo)
2754 }
2755 else{
2756 current_url="stop"
2757 }
2758 console.log("in functie in plm "+urls.length)
2759 // console.log(current_url)
2760 var start_ajax=new Date();
2761 if (urls.length >= 0 && current_url!="stop") {
2762
2763 let commandId=current_url.split("id=")[1].split("&")[0]
2764 if(map_tagged.get(commandId)!=labelInfo || current_tag!=labelInfo)
2765 {
2766 map_tagged.set(commandId,labelInfo.trim())
2767
2768 $.ajax({
2769 url: current_url,
2770 method: 'POST',
2771 dataType: "json",
2772 data: { text: labelInfo },
2773 headers: { 'TribalWars-Ajax': 1 },
2774 success: (data) => {
2775 $("span[data-id="+obj.incomingId+"]").find(".quickedit-label").text(labelInfo)
2776 UI.InfoMessage(indexIncoming+"/"+url_length)
2777 indexIncoming++;
2778 var stop_ajax=new Date();
2779 var dif_time=stop_ajax.getTime()-start_ajax.getTime();
2780 console.log("dif_time "+dif_time+" wait "+(200-dif_time))
2781 window.setTimeout(function(){
2782 ajaxRequest (list_incomings_href)
2783
2784 },200-dif_time)
2785 }
2786 })
2787 }
2788 else{
2789 console.log("id: "+commandId+" already tagged")
2790 ajaxRequest (list_incomings_href)
2791 indexIncoming++;
2792 }
2793
2794
2795
2796 }
2797 else
2798 {
2799 UI.SuccessMessage("done",2000)
2800 var stop_tagging=new Date();
2801 console.log("total time "+stop_tagging.getTime()-start_tagging.getTime())
2802 let data=lzw_encode(JSON.stringify(Array.from(map_tagged.entries())))
2803 localStorage.setItem(game_data.world+"map_tagged",data)
2804
2805 }
2806 }
2807 ajaxRequest(list_incomings_href);
2808
2809 }
2810
2811
2812}
2813
2814function getLandTime(time_land){
2815 var date_land=""
2816 let server_date=document.getElementById("serverDate").innerText.split("/")
2817 if(time_land.includes(wordsTranslate[1])){ //today
2818 console.log("here")
2819 date_land=server_date[1]+"/"+server_date[0]+"/"+server_date[2]+" "+time_land.match(/\d+:\d+:\d+:\d+/)[0]
2820 }
2821 else if(time_land.includes(wordsTranslate[2])){ //tomorrow
2822 var tomorrow_date=new Date(server_date[1]+"/"+server_date[0]+"/"+server_date[2]);
2823 tomorrow_date.setDate(tomorrow_date.getDate()+1);
2824 date_land= ("0"+(tomorrow_date.getMonth()+1)).slice(-2)+"/"+("0"+tomorrow_date.getDate()).slice(-2)+"/"+tomorrow_date.getFullYear()+" "+time_land.match(/\d+:\d+:\d+:\d+/)[0];
2825 }else if(time_land.includes(wordsTranslate[3])){ //on
2826 var on=time_land.match(/\d+.\d+/)[0].split(".");
2827 date_land=on[1]+"/"+on[0]+"/"+server_date[2]+" "+time_land.match(/\d+:\d+:\d+:\d+/)[0];
2828 }
2829 return date_land;
2830}
2831
2832function calcProductionTroupes(time,popReport){
2833 var maxPop=popReport;
2834 let nrAxemax=6000,nrLcMax=3000,nrRamMax=400;
2835 let countAxe=0,countLc=0,countRam=0;
2836 let time_temp=time
2837 while(maxPop<20000 && time_temp>0){
2838 if(countAxe<nrAxemax){
2839 countAxe++;
2840 time_temp-=axeTime;
2841 maxPop+=1
2842 }
2843 else break;
2844 }
2845 time_temp=time
2846 while(maxPop<20000 && time_temp>0){
2847 if(countLc<nrLcMax){
2848 countLc++;
2849 time_temp-=lhTime;
2850 maxPop+=4
2851 }
2852 else break;
2853 }
2854 time_temp=time
2855 while(maxPop<20000 && time_temp>0){
2856 if(countRam<nrRamMax){
2857 countRam++;
2858 time_temp-=ramTime;
2859 maxPop+=5
2860 }
2861 else break;
2862 }
2863
2864 // console.log("axe "+countAxe+" lc "+countLc+" ram "+countRam)
2865 // console.log(maxPop)
2866 maxPop=(maxPop/20000)*100
2867 return maxPop
2868}
2869 //////////////////////////////////////////////////////search reports /////////////////////////////////////////////////////////////////
2870 var map_search
2871async function loadReports(){
2872
2873 map_search=await readFileDropbox(filename_reports).catch(err=>alert(err))
2874 map_search=new Map( JSON.parse( lzw_decode(map_search) ));
2875 UI.SuccessMessage("load reports")
2876 console.log(map_search)
2877 loadReportsOk=true;
2878 $("#input_search").on("input",function(){
2879 let current_value=$("#input_search").val()
2880 if(current_value.match(/[0-9]{3}\|[0-9]{3}/)!=null){
2881 coords=current_value.match(/[0-9]{3}\|[0-9]{3}/g)
2882 console.log(coords)
2883 $("#report_view").empty()
2884 let contentHtml=""
2885 let nr_found=0;
2886 for(let i=0;i<coords.length;i++){
2887 if(map_search.has(coords[i])){
2888 let obj=map_search.get(coords[i]);
2889 console.log(coords[i])
2890 contentHtml+= `<div>
2891 <center style="margin:10px"><input class="btn evt-confirm-btn btn-confirm-yes" type="button"onclick="$('#table`+i+`').toggle('slow')" value="`+coords[i]+`"></center>
2892
2893 <table class="table_hide" id="table`+i+'"'+
2894 createReport(obj)+
2895 `</table></div>`;
2896 nr_found++;
2897 }
2898 }
2899 $("#report_view").append(contentHtml)
2900 $(".table_hide").hide();
2901 $("#progress_search").text("found: "+nr_found)
2902 }else{
2903 $("#report_view").empty()
2904 }
2905
2906 })
2907 $("#input_search").mouseout(function(){
2908 let current_value=$("#input_search").val()
2909 if(current_value.match(/[0-9]{3}\|[0-9]{3}/)!=null){
2910 let coords=current_value.match(/[0-9]{3}\|[0-9]{3}/g)
2911 $("#input_search").val(Array.from(coords).join(","))
2912 }
2913 })
2914
2915
2916}
2917
2918///////////////////////////////////////////////////////create table for view report//////////////////////////////////////////////////////
2919function createReport(obj){
2920 var tableHTML=``;
2921 if(obj.attackingArmy!=undefined){
2922 tableHTML=`
2923 <tbody>
2924 <tr>
2925 <td>Battle time </td>
2926 <td>`+ obj.time_report +`</td>
2927 </tr>
2928 <tr>
2929 <td colspan="2" valign="top" height="160" style="border: solid 1px ; padding 4px;" class="report_ReportAttack">
2930 <table id="attack_info_att" width=100% style="border: 1px solid #DED3B9">
2931 <tbody>
2932 <tr>
2933 <th style="width:20%">Attacker:</th>
2934 <th >`+obj.nameAttacker+`</th>
2935 </tr>
2936 <tr>
2937 <td >Origin:</td>
2938 <td >`+obj.coordAttacker+`</td>
2939 </tr>
2940 <tr>
2941 <td colspan="2" style="padding:0px">`+
2942 createTableTroupes(obj.attackingArmy,obj.attackingArmyLosses)+
2943 `</td>
2944 </tr>
2945 </tbody>
2946 </table>
2947 </td>
2948 </tr>`
2949 }
2950 if(obj.defendingArmy!=undefined){
2951 tableHTML+= `
2952 <tr>
2953 <td colspan="2" valign="top" height="160" style="border: solid 1px ; padding 4px;" >
2954 <table id="attack_info_def" width=100% style="border: 1px solid #DED3B9">
2955 <tbody>
2956 <tr>
2957 <th style="width:20%">Defender:</th>
2958 <th >`+obj.nameDefender+`</th>
2959 </tr>
2960 <tr>
2961 <td >Origin:</td>
2962 <td >`+obj.coordDefender+`</td>
2963 </tr>
2964 <tr>
2965 <td colspan="2" style="padding:0px">`+
2966 createTableTroupes(obj.defendingArmy,obj.defendingArmyLosses)+
2967 `</td>
2968 </tr>
2969 </tbody>
2970 </table>
2971 </td>
2972 </tr>
2973 `
2974 }
2975
2976 if(obj.travelingTroops!=undefined){
2977 tableHTML+= `
2978 <tr>
2979 <td colspan="2" valign="top" height="160" style="border: solid 1px ; padding 4px;">
2980 <table id="attack_spy_away" width=100% style="border: 1px solid #DED3B9; width:100%; margin-top:5px;">
2981 <tbody>
2982 <tr>
2983 <th colspan="2">Units outside of village:</th>
2984 </tr>
2985
2986 <tr>
2987 <td colspan="2" >`+
2988 createTableTroupesAway(obj.travelingTroops)+
2989 `</td>
2990 </tr>
2991 </tbody>
2992 </table>
2993 </td>
2994 </tr>
2995 `
2996 }
2997 if(obj.attackingArmy!=undefined){
2998 tableHTML+="</tbody>"
2999 }
3000
3001 return tableHTML
3002}
3003
3004function createTableTroupes(totalArmy,lostArmy){
3005 let tableHTML=`
3006 <table class="vis" >
3007 <tbody>
3008 <tr class="center">
3009 <td width="20"></td>`
3010
3011 let units=game_data.units
3012 for(let i=0;i<totalArmy.length;i++){
3013 if(units[i]!="militia"){
3014 if(totalArmy[i].count==0 )
3015 tableHTML+=`<td width="35"><img src="https://dsen.innogamescdn.com/asset/3ec301e5/graphic/unit/unit_`+units[i]+`.png" alt class="faded"</td>`
3016 else
3017 tableHTML+=`<td width="35"><img src="https://dsen.innogamescdn.com/asset/3ec301e5/graphic/unit/unit_`+units[i]+`.png"</td>`
3018 }
3019 }
3020 tableHTML+="</tr>"
3021 tableHTML+=`
3022 <tr>
3023 <td width="20">Quantity:</td>`
3024 for(let i=0;i<totalArmy.length;i++){
3025 if(units[i]!="militia"){
3026 if(totalArmy[i].count==0)
3027 tableHTML+=`<td style="text-align:center" class="unit-item unit-item-`+units[i]+` hidden">`+totalArmy[i].count+"</td>"
3028 else
3029 tableHTML+=`<td style="text-align:center" class="unit-item unit-item-`+units[i]+`">`+totalArmy[i].count+"</td>"
3030 }
3031 }
3032 tableHTML+="</tr>"
3033 tableHTML+=`
3034 <tr>
3035 <td width="20">Losses:</td>`
3036 for(let i=0;i<lostArmy.length;i++){
3037 if(units[i]!="militia"){
3038 if(lostArmy[i].count==0)
3039 tableHTML+=`<td style="text-align:center" class="unit-item unit-item-`+units[i]+` hidden">`+lostArmy[i].count+"</td>"
3040 else
3041 tableHTML+=`<td style="text-align:center" class="unit-item unit-item-`+units[i]+`">`+lostArmy[i].count+"</td>"
3042 }
3043 }
3044 tableHTML+="</tr>"
3045
3046
3047
3048
3049 tableHTML+="</tr></tbody></table>"
3050 return tableHTML
3051}
3052
3053
3054function createTableTroupesAway(totalArmy){
3055 let tableHTML=`
3056 <table class="vis">
3057 <tbody>
3058 <tr class="center">`
3059
3060 let units=game_data.units
3061 Object.keys(totalArmy).forEach(key=>{
3062 if(totalArmy[key]==0)
3063 tableHTML+=`<th width="35"><img src="https://dsen.innogamescdn.com/asset/3ec301e5/graphic/unit/unit_`+key+`.png" alt class="faded"</th>`
3064 else
3065 tableHTML+=`<th width="35"><img src="https://dsen.innogamescdn.com/asset/3ec301e5/graphic/unit/unit_`+key+`.png"</th>`
3066
3067 })
3068
3069
3070 tableHTML+="</tr>"
3071 tableHTML+=`<tr>`
3072 Object.keys(totalArmy).forEach(key=>{
3073 if(totalArmy[key]==0)
3074 tableHTML+=`<td style="text-align:center" class="unit-item unit-item-`+key+` hidden">`+totalArmy[key]+"</td>"
3075 else
3076 tableHTML+=`<td style="text-align:center" class="unit-item unit-item-`+key+`">`+totalArmy[key]+"</td>"
3077
3078 })
3079 tableHTML+="</tr>"
3080
3081 tableHTML+="</tr></tbody></table>"
3082 return tableHTML
3083}
3084
3085function createTableIncomings(list){
3086 let serverTime=document.getElementById("serverTime").innerText
3087 let serverDate=document.getElementById("serverDate").innerText.split("/")
3088 serverDate=serverDate[1]+"/"+serverDate[0]+"/"+serverDate[2]
3089 let date_current=new Date(serverDate+" "+serverTime).getTime()
3090 let html_incomings=`
3091 <tbody>
3092 <tr>
3093 <th><img src="https://dsen.innogamescdn.com/asset/056b9c0b/graphic/unit/att.png"></<th>
3094 <th >speed</th>
3095 <th colspan="2">destination</th>
3096 <th colspan="2">origin</th>
3097 <th >Arrival time</th>
3098 <th >Arrives in</th>
3099 </tr>`
3100
3101 for(let i=0;i<list.length;i++){
3102 console.log(list[i])
3103 let labelName
3104 console.log(list[i].labelName)
3105 if(list[i].labelName=="none")
3106 labelName="https://dsen.innogamescdn.com/asset/056b9c0b/graphic/delete.png"
3107 else
3108 labelName=`https://dsen.innogamescdn.com/asset/a9e85669/graphic/unit/tiny/${list[i].labelName}`
3109
3110 console.log(list[i].labelName)
3111 let arrived=new Date(list[i].date_land).getTime()
3112 if(arrived>date_current){
3113 html_incomings+=`
3114 <tr>
3115 <td><img src="https://dsen.innogamescdn.com/asset/a9e85669/graphic/command/${list[i].type_attack}"> </td>
3116 <td><img src="${labelName}"> </td>
3117 <td><a href="${game_data.link_base_pure}info_village&id=${list[i].id_coord_def}"> (${list[i].coord_def})</a> </td>
3118 <td><a href="${game_data.link_base_pure}info_player&id=${list[i].id_player_def}"> ${list[i].player_def}</a> </td>
3119 <td><a href="${game_data.link_base_pure}info_village&id=${list[i].id_coord_off}">(${list[i].coord_off}) </a> </td>
3120 <td><a href="${game_data.link_base_pure}info_player&id=${list[i].id_player_off}">${list[i].player_off} </a> </td>
3121 <td>${list[i].date_land.split(" ")[0]} <b>${list[i].date_land.split(" ")[1]}</b></td>
3122 <td date-time=${arrived} class="counterTime"></td>
3123 </tr>
3124 `
3125 }
3126 }
3127 html_incomings+="</tbody>"
3128 return html_incomings
3129}
3130
3131function counterTime(){
3132
3133 window.setInterval(()=>{
3134
3135 $(".counterTime").each((index,item)=>{
3136 let serverTime=document.getElementById("serverTime").innerText
3137 let serverDate=document.getElementById("serverDate").innerText.split("/")
3138 serverDate=serverDate[1]+"/"+serverDate[0]+"/"+serverDate[2]
3139 let date_current=new Date(serverDate+" "+serverTime).getTime()
3140 // console.log(date_current)
3141
3142 let time=parseInt(item.getAttribute("date-time"))
3143 let hours=("0"+parseInt((time-date_current)/(3600*1000))).slice(-3);
3144 let minutes=("0"+parseInt(((time-date_current)/(60*1000)%60))).slice(-2);
3145 let seconds=( "0"+parseInt((((time-date_current)/1000)%60))).slice(-2);
3146 result=hours+":"+minutes+":"+seconds
3147 item.innerText=result
3148 })
3149 },1000)
3150
3151
3152}
3153
3154
3155////////////////////////////////////////////////////////get speed world///////////////////////////////////////////////////
3156
3157
3158function getSpeedConstant() { //Get speed constant (world speed * unit speed) for world
3159 if (localStorage.getItem(game_data.world+"speedWorld") !== null) {
3160 let obj=JSON.parse(localStorage.getItem(game_data.world+"speedWorld"))
3161 console.log("speed world already exist")
3162 return obj
3163 }
3164 else { //Get data from xml and save it in localStorage to avoid excessive XML requests to server
3165 let currentHtml=document.body.innerHTML
3166 document.body.innerHTML = httpGet("/interface.php?func=get_config") //Load world data
3167 let obj={}
3168 let worldSpeed = Number(document.getElementsByTagName("speed")[0].innerHTML)
3169 let unitSpeed = Number(document.getElementsByTagName("unit_speed")[0].innerHTML);
3170 obj.unitSpeed=unitSpeed
3171 obj.worldSpeed=worldSpeed
3172 document.body.innerHTML=currentHtml
3173 localStorage.setItem(game_data.world+"speedWorld",JSON.stringify(obj));
3174 console.log("save speed world")
3175 return obj
3176 }
3177}
3178
3179
3180/////////////////////////////////////////////////////// interface for get all tr from incomings page/////////////////////////////////////////
3181function setIntervalIncomings(){
3182 htmlInc = `
3183 <div id="div_container" class="ui-widget-content div_remove" style="width:600px;background-color:${backgroundColor};cursor:move;z-index:50;">
3184 <div class="close-btn" btn_close="btn_close" onclick="closeWindow()" style="position:absolute;top:10px;right: 10px;"><b><a href=#><font color="${titleColor}">X</font></b></a></div>
3185 <h2><center style="margin:10px"><u><font color="${titleColor}">get all incomings</font></u></center></h2>
3186 <table id="table_upload" class="" border="1" style="width: 100%;background-color:${backgroundColor};border-color:${borderColor}">
3187 <tr>
3188 <td style="text-align:center; width:auto; background-color:${headerColor}">
3189 <p><center style="margin:10px"><font color="${titleColor}">between hours </font></center></p>
3190 </td>
3191 <td style="text-align:center; width:auto; background-color:${headerColor}">
3192 <p><center style=""><input type="number" id="id_start" size="5" style="text-align:center" class=" input-nicer show" value="0"><br><br></center></p>
3193 </td>
3194 <td style="text-align:center; width:auto; background-color:${headerColor}">
3195 <p><center style=""><input type="number" id="id_stop" size="5" style="text-align:center" class=" input-nicer show" value="100"><br><br></center></p>
3196 </td>
3197
3198 </tr>
3199 </table>
3200 <center style="margin:10px"><u><input class="btn" type="button" id="btn_village" onclick="getTrIncomings()" value="Start"></center>
3201
3202
3203
3204 </div>
3205 `;
3206 ////////////////////////////////////////add and remove window from page/////////////////////////////////////////////////////////////////
3207 $("#div_container").remove()
3208 $("#contentContainer").eq(0).prepend(htmlInc);
3209 $("#mobileContent").eq(0).prepend(htmlInc);
3210
3211 if(game_data.device=="desktop"){
3212 $("#div_container").css("position","fixed");
3213 $("#div_container").draggable();
3214 }
3215 $('#id_start').on('input',function(e){
3216 let value=this.value;
3217 localStorage.setItem(game_data.world+"startInc",value)
3218 });
3219 $('#id_stop').on('input',function(e){
3220 let value=this.value;
3221 localStorage.setItem(game_data.world+"stopInc",value)
3222 });
3223 if(localStorage.getItem(game_data.world+"startInc")!=null)
3224 $('#id_start').val(localStorage.getItem(game_data.world+"startInc"))
3225 if(localStorage.getItem(game_data.world+"stopInc")!=null)
3226 $('#id_stop').val(localStorage.getItem(game_data.world+"stopInc"))
3227
3228
3229}
3230
3231//////////////////////////////////////////////get a list with all tr ///////////////////////////////////////////////////////////////////
3232function getTrIncomings(){
3233
3234 //get pages for all incoming
3235 let list_pages=[]
3236 let start=parseInt(document.getElementById("id_start").value)
3237 let stop=parseInt(document.getElementById("id_stop").value)
3238
3239 if(document.getElementsByClassName("vis")[1].getElementsByTagName("select").length>0){
3240 Array.from(document.getElementsByClassName("vis")[1].getElementsByTagName("select")[0]).forEach(function(item){
3241 list_pages.push(item.value)
3242 })
3243 list_pages.pop();
3244 }
3245 else if(document.getElementsByClassName("paged-nav-item").length>0){//all pages from the current folder
3246 let nr=0;
3247 Array.from(document.getElementsByClassName("paged-nav-item")).forEach(function(item){
3248 let current=item.href;
3249 current=current.split("page=")[0]+"page="+nr
3250 nr++;
3251 list_pages.push(current);
3252 })
3253 }
3254 else{
3255 let current_link=window.location.href;
3256 list_pages.push(current_link);
3257 }
3258 list_pages=list_pages.reverse();
3259
3260
3261 // go to every page and get incoming
3262 var rows=[]
3263 function ajaxRequest (urls) {
3264 let current_url
3265 var startAjax=new Date().getTime();
3266 if(urls.length>0){
3267 current_url=urls.pop()
3268 }
3269 else{
3270 current_url="stop"
3271 }
3272 console.log(current_url)
3273 if (urls.length >= 0 && current_url!="stop") {
3274 $.ajax({
3275 url: current_url,
3276 method: 'get',
3277 success: (data) => {
3278 document.body.innerHTML=data
3279 var table_incomings=document.getElementById("incomings_table").children[1].children
3280 for(let i=1;i<table_incomings.length-1;i++){
3281 rows.push(table_incomings[i])
3282 }
3283 var stopAjax=new Date().getTime();
3284 var diff=stopAjax-startAjax
3285 console.log("wait inc: "+(200-diff))
3286 window.setTimeout(function(){
3287 ajaxRequest (list_pages)
3288 },200-diff)
3289 }
3290 })
3291
3292 }
3293 else
3294 {
3295 $(".row_a").remove();
3296 $(".row_b").remove();
3297 var table_incomings=document.getElementById("incomings_table")
3298 var lastRow=table_incomings.children[1].children[1];
3299 table_incomings.children[1].children[1].remove();
3300 var nr_row=0;
3301 for(let i=0;i<rows.length;i++){
3302 var hours=rows[i].children[ rows[i].children.length-1 ].innerText.split(":")[0]
3303 if(hours>=start && hours< stop){
3304 $(table_incomings).append(rows[i])
3305 nr_row++;
3306 }
3307 }
3308 table_incomings.children[1].children[0].children[0].innerText="Command ("+nr_row+")"
3309 $(table_incomings).append(lastRow)
3310
3311 //activate renaming
3312 $('document').ready(function() {
3313 CommandsOverview.init();
3314 UI.ToolTip('.icon_village_notes');
3315
3316 $('.quickedit').QuickEdit({url: TribalWars.buildURL('POST', 'info_command', {ajaxaction: 'edit_other_comment', id: '__ID__'})});
3317 Command.init();
3318 });
3319 UI.SuccessMessage("done")
3320 console.log(rows)
3321 showButtons();
3322
3323 }
3324 }
3325 ajaxRequest(list_pages);
3326
3327}
3328
3329/////////////////////////////////////////////highlight trains->yellow, nobles->red, nukes-> green////////////////////////////////////////
3330function highLightIncomings(){
3331 let table=document.querySelectorAll(".row_a,.row_b")
3332 if(localStorage.getItem(game_data.world+"highlight")=="true"){
3333 let colors = {
3334 yellow: '#ffff66',
3335 red: '#ff8080',
3336 green: '#4dff4d'
3337 };
3338 document.getElementById("btn_highlight").classList.remove("btn-confirm-no")
3339 document.getElementById("btn_highlight").classList.add("btn-confirm-yes")
3340 for(let i=0;i<table.length;i++){
3341 let length_tr=table[i].children.length
3342 table[i].classList.remove("selected")
3343 //highlight nukes if has more than 70% pop
3344
3345 if(document.getElementById("id_type")!=null && table[i].firstElementChild.style.backgroundColor!="rgb(255, 255, 102)"){//is different then yellow
3346 let watchTower=table[i].children[0].getElementsByTagName("img")[0].src.includes("attack_large.png")
3347 let watchTowerSmall=table[i].children[0].getElementsByTagName("img")[0].src.includes("attack_small.png")
3348 let hasNuke=false
3349 if(table[i].getElementsByClassName("cls_type").length>0){
3350 let type=table[i].getElementsByClassName("cls_type")[0].innerText
3351 let pop=parseFloat(table[i].getElementsByClassName("cls_pop")[0].innerText)
3352 if(((type=="off" && pop>70)|| watchTower==true) && watchTowerSmall==false){//must be tested
3353 hasNuke=true;
3354 }
3355 }
3356 if(hasNuke==true || watchTower==true ){
3357 $(table[i]).children().each(function(){
3358 console.log("color")
3359 $(this).css('background-color', colors.green);
3360 });
3361 }
3362 }
3363
3364 //highlight all possible trains
3365 for(let j=i+1;j<table.length;j++){
3366 let tr1=table[i].children[length_tr-2].innerText.match(/[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{3}/)[0]
3367 let tr2=table[j].children[length_tr-2].innerText.match(/[0-9]{2}\:[0-9]{2}\:[0-9]{2}\:[0-9]{3}/)[0]
3368 let time1=parseInt(tr1.split(":")[0])*3600*1000+parseInt(tr1.split(":")[1])*60*1000+parseInt(tr1.split(":")[2])*1000+parseInt(tr1.split(":")[3])
3369 let time2=parseInt(tr2.split(":")[0])*3600*1000+parseInt(tr2.split(":")[1])*60*1000+parseInt(tr2.split(":")[2])*1000+parseInt(tr2.split(":")[3])
3370
3371 if(table[i].children[2].innerHTML==table[j].children[2].innerHTML){//if origin coord is the same
3372 if(Math.abs(time1-time2)==50 || Math.abs(time1-time2)==100 || Math.abs(time1-time2)==150){
3373 console.log(tr1+" === "+tr2)
3374 console.log(time1+" === "+time2)
3375 console.log("diference tr: "+(time2-time1))
3376
3377 $(table[i]).children().each(function(){
3378 console.log("color i")
3379 $(this).css('background-color', colors.yellow);
3380 });
3381 console.log(table[j])
3382 $(table[j]).children().each(function(){
3383 console.log("color j")
3384 $(this).css('background-color', colors.yellow);
3385 });
3386 console.log(table[j])
3387 break;
3388 }
3389 }
3390 if(Math.abs(time1-time2)>200)
3391 break;
3392 }
3393
3394
3395
3396
3397
3398
3399 // highlist if it is tagged as noble
3400 if(table[i].children[0].getElementsByTagName("img").length==2){
3401 let hasNoble=table[i].children[0].getElementsByTagName("img")[1].src.includes("snob.png")
3402 if(hasNoble==true){
3403 $(table[i]).find('td').each(function(){
3404 $(this).css('background-color', colors.red);
3405 });
3406 }
3407 }
3408
3409 }
3410 }
3411 else{
3412 for(let i=0;i<table.length;i++){
3413 $(table[i]).children().each(function(){
3414 $(this).css('background-color', "");
3415 });
3416 }
3417 document.getElementById("btn_highlight").classList.remove("btn-confirm-yes")
3418 document.getElementById("btn_highlight").classList.add("btn-confirm-no")
3419 }
3420
3421
3422
3423}
3424if(window.location.href.includes("mode=incomings"))
3425 highLightIncomings();
3426
3427function toggleHighLight(){
3428
3429 if(localStorage.getItem(game_data.world+"highlight")!=null){
3430 let isHighLight=localStorage.getItem(game_data.world+"highlight")
3431 if(isHighLight=="true"){
3432 localStorage.setItem(game_data.world+"highlight","false")
3433 // UI.ErrorMessage("highlight off",500)
3434 highLightIncomings();
3435 }
3436 else{
3437 localStorage.setItem(game_data.world+"highlight","true")
3438 // UI.SuccessMessage("highlit on",500)
3439 highLightIncomings();
3440 }
3441
3442 }
3443 else{
3444 localStorage.setItem(game_data.world+"highlight","true")
3445 highLightIncomings();
3446 }
3447}
3448
3449/////////////////////////////////////////////get and add troops on incoming page for each village////////////////////////////////////////////
3450function eventGetTroops(){
3451 var units=game_data.units
3452
3453
3454 $(".load_troops").on("click",function(event){
3455 event.preventDefault()
3456 $(".load_troops").attr("disabled", true)
3457 let villageId=this.getAttribute("data-id")
3458 let nr_attacks=this.getAttribute("data-nr")
3459 let link_home_troops=game_data.link_base_pure + `map&ajax=map_info&source=${villageId}&target=${villageId}&`
3460 let link_coming_troops=window.location.href.split("village=")[0]+`village=${villageId}&screen=place&mode=call&target=${villageId}`
3461 let coord=this.innerText.match(/[0-9]{3}\|[0-9]{3}/)[0]
3462 let button=this
3463 console.log(link_home_troops)
3464 this.parentElement.classList.remove("selected")
3465
3466
3467
3468 let time_start=new Date().getTime();
3469 $.get(link_home_troops,function(response){
3470 console.log(response)
3471 let obj_troops={}
3472 for(let i=0;i<units.length-1;i++){
3473 obj_troops[units[i]]=parseInt(response.units[units[i]].count.home)+parseInt(response.units[units[i]].count.foreign)
3474 }
3475 let wallLevel,farmLevel,flagName,LoyaltyLevel
3476 wallLevel=response.buildings.wall
3477 farmLevel=response.buildings.farm
3478 LoyaltyLevel=response.mood
3479 console.log(response.flag)
3480 if(response.flag!=undefined)
3481 flagName =response.flag.short_desc
3482 else
3483 flagName="none"
3484 console.log(obj_troops)
3485 console.log("wallLevel: "+wallLevel)
3486 console.log("farmLevel: "+farmLevel)
3487 console.log("flagName: "+flagName)
3488 console.log("LoyaltyLevel: "+LoyaltyLevel)
3489
3490
3491
3492 let htmlDiv=`<div id="div_coming_troops" hidden></div>`
3493 $("#contentContainer").eq(0).prepend(htmlDiv)
3494 console.log(link_coming_troops)
3495
3496 $.get(link_coming_troops,function(data){
3497 document.getElementById("div_coming_troops").innerHTML=data
3498
3499 let obj_troops_coming={snob:0}
3500 let troops_coming=document.getElementById("div_coming_troops").querySelectorAll("#support_sum td")
3501 console.log(troops_coming)
3502 for(let i=0;i<troops_coming.length-1;i++){
3503 let name=troops_coming[i].getAttribute("data-unit")
3504 let value=parseInt(troops_coming[i].innerText)
3505 obj_troops_coming[name]=value
3506 }
3507 document.getElementById("div_coming_troops").remove()
3508
3509
3510
3511
3512 let html=`
3513 <div style="width:600px;background-color:${backgroundColor};cursor:move;width:50%;margin:10px auto">
3514
3515 <table class="" border="1" style="width: 100%;background-color:${backgroundColor};border-color:${borderColor}">
3516 <tr>
3517 <td style="text-align:center; width:auto; background-color:${headerColor}">
3518 <p><center style="margin:10px"><font color="${titleColor}">coord </font></center></p>
3519 </td>
3520 <td style="text-align:center; width:auto; background-color:${headerColor}">
3521 <p><center style="margin:10px"><font color="${titleColor}"><img src="https://dsen.innogamescdn.com/asset/4ba99e83/graphic/unit/att.png"> </font></center></p>
3522 </td>
3523 <td style="text-align:center; width:auto; background-color:${headerColor}">
3524 <p><center style="margin:10px"><font color="${titleColor}"><img src="https://dsen.innogamescdn.com/asset/4ba99e83/graphic/flags/small/3.png"> </font></center></p>
3525 </td>
3526 <td style="text-align:center; width:auto; background-color:${headerColor}">
3527 <p><center style="margin:10px"><font color="${titleColor}"><img src="https://dsen.innogamescdn.com/asset/1d2499b/graphic/buildings/snob.png"> </font></center></p>
3528 </td>
3529 <td style="text-align:center; width:auto; background-color:${headerColor}">
3530 <p><center style="margin:10px"><font color="${titleColor}"><img src="https://dsen.innogamescdn.com/asset/1d2499b/graphic/buildings/wall.png"> </font></center></p>
3531 </td>
3532 <td style="text-align:center; width:auto; background-color:${headerColor}">
3533 <p><center style="margin:10px"><font color="${titleColor}"><img src="https://dsen.innogamescdn.com/asset/1d2499b/graphic/buildings/farm.png"> </font></center></p>
3534 </td>
3535 <td style="text-align:center; width:auto; background-color:${headerColor}">
3536 <p><center style="margin:10px"><font color="${titleColor}">troops </font></center></p>
3537 </td>
3538
3539 `;
3540 for(let i=0;i<units.length-1;i++){
3541 html+=`<td class="fm_unit" style="width:30px;text-align:center;width:auto; background-color:${headerColor}"><img src="https://dsen.innogamescdn.com/asset/1d2499b/graphic/unit/unit_${units[i]}.png"></td>`
3542 }
3543 html+=`
3544 <td style="text-align:center; width:auto; background-color:${headerColor}">
3545 <p><center style="margin:10px"><font color="${titleColor}">pop</font></center></p>
3546 </td>`
3547 html+=`</tr>
3548 <tr>`
3549
3550 html+=`
3551 <td rowspan="3" class="" style="width:30px;height:30px;text-align:center; background-color:${headerColor};color:white">${coord}</td>
3552 <td rowspan="3" class="" style="width:70px;height:30px;text-align:center; background-color:${headerColor};color:white">${nr_attacks}</td>
3553 <td rowspan="3" class="" style="width:70px;height:30px;text-align:center; background-color:${headerColor};color:white">${flagName}</td>
3554 <td rowspan="3" class="" style="width:30px;height:30px;text-align:center; background-color:${headerColor};color:white">${LoyaltyLevel}</td>
3555 <td rowspan="3" class="" style="width:30px;height:30px;text-align:center; background-color:${headerColor};color:white">${wallLevel}</td>
3556 <td rowspan="3" class="" style="width:30px;height:30px;text-align:center; background-color:${headerColor};color:white">${farmLevel}</td>
3557 <td style="text-align:center; width:auto; background-color:${headerColor}">
3558 <p><center style="margin:10px"><font color="${titleColor}">home</font></center></p>
3559 </td>
3560 `
3561 //home troops
3562 let total_pop=0;
3563 for(let i=0;i<units.length-1;i++){
3564 let value_troop=obj_troops[units[i]]
3565 let name_troop=units[i]
3566 if(name_troop!="spy" && name_troop!="light" && name_troop!="marcher" && name_troop!="ram"&& name_troop!="catapult" && name_troop!="axe"){
3567 total_pop+=value_troop*troopsPop[name_troop]
3568 }
3569 html+=`<td style="width:30px;height:30px;text-align:center; background-color:${headerColor};color:white">`+value_troop+"</td>"
3570 }
3571 html+=`<td style="width:60px;height:30px;text-align:center; background-color:${headerColor};color:white">`+total_pop+"</td>"
3572 html+=`</tr>
3573 <tr>
3574 <td style="text-align:center; width:auto; background-color:${headerColor}">
3575 <p><center style="margin:10px"><font color="${titleColor}">coming</font></center></p>
3576 </td>`
3577 //coming troops
3578 total_pop=0;
3579 for(let i=0;i<units.length-1;i++){
3580 let value_troop_coming=obj_troops_coming[units[i]]
3581 let name_troop=units[i]
3582 if(name_troop!="spy" && name_troop!="light" && name_troop!="marcher" && name_troop!="ram"&& name_troop!="catapult" && name_troop!="axe"){
3583 total_pop+=value_troop_coming*troopsPop[name_troop]
3584 }
3585 html+=`<td style="width:30px;height:30px;text-align:center; background-color:${headerColor};color:white">`+value_troop_coming+"</td>"
3586 }
3587 html+=`<td style="width:60px;height:30px;text-align:center; background-color:${headerColor};color:white">`+total_pop+"</td>"
3588
3589 html+=`</tr>
3590 <tr>
3591 <td style="text-align:center; width:auto; background-color:${headerColor}">
3592 <p><center style="margin:10px"><font color="${titleColor}">total </font></center></p>
3593 </td>`
3594 //total troops
3595 total_pop=0;
3596 for(let i=0;i<units.length-1;i++){
3597 let value_troop=obj_troops[units[i]]+obj_troops_coming[units[i]]
3598 let name_troop=units[i]
3599 if(name_troop!="spy" && name_troop!="light" && name_troop!="marcher" && name_troop!="ram"&& name_troop!="catapult" && name_troop!="axe"){
3600 total_pop+=value_troop*troopsPop[name_troop]
3601 }
3602 html+=`<td style="width:30px;height:30px;text-align:center; background-color:${headerColor};color:white">`+value_troop+"</td>"
3603 }
3604 html+=`<td style="width:60px;height:30px;text-align:center; background-color:${headerColor};color:white">`+total_pop+"</td>"
3605
3606 html+=`</tr></table></div>`
3607
3608 button.outerHTML=html
3609
3610
3611 let time_stop=new Date().getTime()
3612 console.log("load troops: "+(time_stop-time_start))
3613 $(".load_troops").attr("disabled", false)
3614
3615
3616
3617
3618
3619
3620 })
3621
3622
3623 })
3624
3625
3626 })
3627}
3628eventGetTroops();
3629
3630
3631
3632//////////////////////////////////////////////////////get data from /map/player.txt and /mapvillage.txt/////////////////////////////////////
3633
3634function getInfoVIllages(){
3635 return new Promise((resolve,reject)=>{
3636 $.ajax({
3637 url: "https://content.dropboxapi.com/2/files/download",
3638 method: 'POST',
3639 dataType: "text",
3640 headers: { 'Authorization': 'Bearer ' + dropboxToken,
3641 'Dropbox-API-Arg': JSON.stringify({path: "/"+filname_ino_db})},
3642
3643 success: (data) => {
3644 console.log("get info VIllages")
3645 var mapVillage=new Map();
3646 let obj={};
3647 let server_date=document.getElementById("serverDate").innerText.split("/")
3648 let server_time=document.getElementById("serverTime").innerText
3649 let current_date=new Date(server_date[1]+"/"+server_date[0]+"/"+server_date[2]+" "+server_time);
3650 let url=window.location.href.split("/game.php")[0]
3651 let mapPlayer=new Map();
3652
3653 if(data=="[]"){
3654 let dataVillage=httpGet(url+"/map/village.txt").split(/\r?\n/);
3655 let dataPlayer=httpGet(url+"/map/player.txt").split(/\r?\n/);
3656
3657 for(let i=0;i<dataPlayer.length-1;i++){
3658 // console.log(dataPlayer[i].split(",")[1])
3659 let playerName=innoReplaceSpecialCaracters(dataPlayer[i].split(",")[1])
3660 mapPlayer.set(dataPlayer[i].split(",")[0],{
3661 allyId:dataPlayer[i].split(",")[2],
3662 playerName:playerName
3663 })
3664 }
3665
3666 for(let i=0;i<dataVillage.length;i++){
3667 if(mapPlayer.get(dataVillage[i].split(",")[4])!=undefined){
3668 mapVillage.set(dataVillage[i].split(",")[2]+"|"+dataVillage[i].split(",")[3],{
3669 villageId:dataVillage[i].split(",")[0],
3670 playerId:dataVillage[i].split(",")[4],
3671 points:dataVillage[i].split(",")[5],
3672 allyId:mapPlayer.get(dataVillage[i].split(",")[4]).allyId,
3673 playerName:mapPlayer.get(dataVillage[i].split(",")[4]).playerName
3674 })
3675 }
3676 }
3677 obj.datetime=current_date
3678 obj.data=Array.from(mapVillage.entries())
3679
3680 var data=JSON.stringify(obj)
3681 data=replaceSpecialCaracters(data)
3682 data=lzw_encode(data);
3683 uploadFile(data,filname_ino_db,dropboxToken)
3684
3685
3686 }else{
3687 let ino_db=JSON.parse(lzw_decode(data))
3688 let db_date=ino_db.datetime
3689 mapVillage=new Map(ino_db.data)
3690 // console.log(mapVillage)
3691 if(new Date(current_date).getTime()-new Date(db_date)>3600*1000){
3692
3693 let dataVillage=httpGet(url+"/map/village.txt").split(/\r?\n/);
3694 let dataPlayer=httpGet(url+"/map/player.txt").split(/\r?\n/);
3695
3696 for(let i=0;i<dataPlayer.length-1;i++){
3697 let playerName=innoReplaceSpecialCaracters(dataPlayer[i].split(",")[1])
3698 mapPlayer.set(dataPlayer[i].split(",")[0],{
3699 allyId:dataPlayer[i].split(",")[2],
3700 playerName:playerName
3701 })
3702 }
3703
3704 for(let i=0;i<dataVillage.length;i++){
3705 if(mapPlayer.get(dataVillage[i].split(",")[4])!=undefined){
3706 mapVillage.set(dataVillage[i].split(",")[2]+"|"+dataVillage[i].split(",")[3],{
3707 villageId:dataVillage[i].split(",")[0],
3708 playerId:dataVillage[i].split(",")[4],
3709 points:dataVillage[i].split(",")[5],
3710 allyId:mapPlayer.get(dataVillage[i].split(",")[4]).allyId,
3711 playerName:mapPlayer.get(dataVillage[i].split(",")[4]).playerName
3712 })
3713 }
3714 }
3715 obj.datetime=current_date
3716 obj.data=Array.from(mapVillage.entries())
3717
3718 var data=JSON.stringify(obj)
3719 data=replaceSpecialCaracters(data)
3720 data=lzw_encode(data)
3721 uploadFile(data,filname_ino_db,dropboxToken)
3722 console.log("upload new data")
3723 }
3724 else{
3725 console.log("already exist")
3726 }
3727 }
3728 resolve(mapVillage)
3729
3730 },error:(err)=>{
3731 console.log(err)
3732 reject(err)
3733 }
3734 })
3735 })
3736
3737
3738}
3739
3740function innoReplaceSpecialCaracters(text){
3741 text=text.replaceAll("+"," ")
3742 text=text.replaceAll("%21","!")
3743 text=text.replaceAll("%23","#")
3744 text=text.replaceAll("%24","$")
3745 text=text.replaceAll("%25","%")
3746
3747 text=text.replaceAll("%28","(")
3748 text=text.replaceAll("%29",")")
3749 text=text.replaceAll("%2A","*")
3750 text=text.replaceAll("%2B","+")
3751 text=text.replaceAll("%2C",",")
3752 text=text.replaceAll("%2F ","/")
3753
3754
3755 text=text.replaceAll("%3A",":")
3756 text=text.replaceAll("%3B","}")
3757 text=text.replaceAll("%3D","=")
3758 text=text.replaceAll("%3F","?")
3759
3760 text=text.replaceAll("%40","@")
3761
3762 text=text.replaceAll("%5B","[")
3763 text=text.replaceAll("%5D","]")
3764
3765 text=text.replaceAll("%7B","_")
3766 text=text.replaceAll("%7C","|")
3767 text=text.replaceAll("%7D","|")
3768
3769 text=text.replaceAll("%7E","{")
3770
3771 text=text.replaceAll("%C3%84","Ä")
3772 text=text.replaceAll("%C3%85","Å")
3773 text=text.replaceAll("%C3%86","Æ")
3774 text=text.replaceAll("%C3%A2","â")
3775 text=text.replaceAll("%C3%A4","ä")
3776 text=text.replaceAll("%C3%A5","å")
3777 text=text.replaceAll("%C3%A6","æ")
3778 text=text.replaceAll("%C3%B6","ö")
3779 text=text.replaceAll("%C3%B8","ø")
3780 text=text.replaceAll("%C3%BC","ü")
3781
3782 text=text.replaceAll("%C4%83","ă")
3783
3784 text=text.replaceAll("%C8%99","ș")
3785 text=text.replaceAll("%C5%A3","ţ")
3786 text=text.replaceAll("%C8%9B","ț")
3787
3788 return text
3789}
3790
3791
3792
3793////////////////////////////////////////////// get supports out going from command/support page ///////////////////////////////////////
3794
3795function getCommandsGoing(){
3796
3797 return new Promise((resolve,reject)=>{
3798 //create link
3799 let linkCommand=game_data.link_base_pure+"overview_villages&mode=commands&type=all"
3800
3801 console.log(linkCommand)
3802 document.body.innerHTML=httpGet(linkCommand)
3803
3804
3805 //get pages for all incoming
3806 let list_pages=[]
3807 var map_outgoing_support=new Map()
3808 var map_outgoing_attack=new Map()
3809
3810 if(document.getElementsByClassName("vis")[1].getElementsByTagName("select").length>0){
3811 Array.from(document.getElementsByClassName("vis")[1].getElementsByTagName("select")[0]).forEach(function(item){
3812 list_pages.push(item.value)
3813 })
3814 list_pages.pop();
3815 }
3816 else if(document.getElementsByClassName("paged-nav-item").length>0){//all pages from the current folder
3817 let nr=0;
3818 Array.from(document.getElementsByClassName("paged-nav-item")).forEach(function(item){
3819 let current=item.href;
3820 current=current.split("page=")[0]+"page="+nr
3821 nr++;
3822 list_pages.push(current);
3823 })
3824 }
3825 else{
3826 list_pages.push(linkCommand);
3827 }
3828 list_pages=list_pages.reverse();
3829 console.log(list_pages)
3830
3831
3832 //for each page
3833 function ajaxRequest (urls) {
3834 let current_url
3835 if(urls.length>0){
3836 current_url=urls.pop()
3837 }
3838 else{
3839 current_url="stop"
3840 }
3841 console.log(current_url)
3842 if (urls.length >= 0 && current_url!="stop") {// go to every page and get all rows
3843 $.ajax({
3844 url: current_url,
3845 method: 'get',
3846 success: (data) => {
3847 document.body.innerHTML=data
3848 if(document.getElementById("commands_table")==null){//commands outgoing none
3849 resolve(map_outgoing_support)
3850 }else{
3851 var table_commands=document.getElementById("commands_table").getElementsByTagName("tbody")[0].children
3852 for(let i=1;i<table_commands.length-1;i++){
3853 if(table_commands[i].children[0].innerText.match(/[0-9]{3}\|[0-9]{3}/)!=null){//destination must contains coord destination
3854
3855 let commandId=table_commands[i].getElementsByClassName("own_command")[0].getAttribute("data-command-id")
3856 let coord_destination=table_commands[i].getElementsByClassName("quickedit-label")[0].innerText.match(/[0-9]{3}\|[0-9]{3}/)[0]
3857 let coord_origin=table_commands[i].children[1].innerText.match(/[0-9]{3}\|[0-9]{3}/)[0]
3858 let coord_origin_id=table_commands[i].children[1].getElementsByTagName("a")[0].href.split("id=")[1]
3859 let landing_time=getLandTime(table_commands[i].children[2].innerText)
3860 let troops={}
3861 let player_origin_name=game_data.player.name
3862 let player_origin_id=game_data.player.id
3863 Array.from(table_commands[i].getElementsByClassName("unit-item")).forEach((elem,index)=>{
3864 troops[game_data.units[index]]=parseInt(elem.innerText)
3865 })
3866
3867 //add data for the current command into a map
3868 let type_attack=table_commands[i].getElementsByTagName("img")[0].src.split("command/")[1]
3869 if(type_attack.includes("support")){
3870 delete troops["snob"]
3871 map_outgoing_support.set(commandId,{
3872 coord_destination:coord_destination,
3873 coord_origin:coord_origin,
3874 landing_time:landing_time,
3875 troops:troops,
3876 player_origin_name:player_origin_name,
3877 player_origin_id:player_origin_id,
3878 commandId:commandId,
3879 coord_origin_id:coord_origin_id,
3880 type_attack:type_attack,
3881 labelName:"none"
3882
3883 })
3884 }
3885 else if(type_attack=="attack_small.png" || type_attack=="attack_medium.png" || type_attack=="attack_large.png"){
3886 console.log("is an attack")
3887 let serverTime=document.getElementById("serverTime").innerText
3888 let serverDate=document.getElementById("serverDate").innerText.split("/")
3889 serverDate=serverDate[1]+"/"+serverDate[0]+"/"+serverDate[2]
3890 let date_current=new Date(serverDate+" "+serverTime)
3891 date_current.setDate(date_current.getDate()+7)
3892
3893
3894 map_outgoing_attack.set(commandId,{
3895 coord_destination:coord_destination,
3896 coord_origin:coord_origin,
3897 landing_time:landing_time,
3898 troops:troops,
3899 player_origin_name:player_origin_name,
3900 player_origin_id:player_origin_id,
3901 commandId:commandId,
3902 coord_origin_id:coord_origin_id,
3903 type_attack:type_attack,
3904 labelName:"none",
3905 uploadTime:date_current.getTime()
3906
3907 })
3908 }
3909 }
3910 }
3911
3912 UI.SuccessMessage("get page: "+urls.length)
3913 window.setTimeout(function(){
3914 ajaxRequest (list_pages)
3915 },200)
3916
3917 }
3918 }
3919 })
3920
3921 }
3922 else//append all rows into table
3923 {
3924 UI.SuccessMessage("done")
3925 resolve([map_outgoing_support,map_outgoing_attack])
3926 }
3927 }
3928 ajaxRequest(list_pages);
3929 })
3930
3931}
3932
3933////////////////////////////////////////////// get coming supports and attacks from incoming page ///////////////////////////////////////
3934
3935 function getSupportsAndAttacks(){
3936 return new Promise( (resolve,reject)=>{
3937
3938 if(document.getElementsByClassName("info").length>0)
3939 $(".info").remove()
3940 var current_href_incomings=window.location.href;
3941 ////////////////////////////////////////////////unIgnored attacks/supports....................................
3942 let incomings_href=game_data.link_base_pure+"overview_villages&mode=incomings&type=unignored&subtype=all&group=0&page=-1";
3943
3944 console.log("currentLink")
3945 console.log(incomings_href)
3946 document.body.innerHTML=httpGet(incomings_href);
3947
3948
3949
3950
3951 if(document.getElementsByClassName("overview_filters_delete").length>0){
3952 reject("turn off filters on incomings page")
3953 }
3954 let list_href=[];
3955 if(document.getElementsByClassName("vis")[1].getElementsByTagName("select").length>0){
3956 Array.from(document.getElementsByClassName("vis")[1].getElementsByTagName("select")[0].options).forEach(el=>{
3957 list_href.push({
3958 href:el.value,
3959 unignored:true
3960 });
3961 })
3962 list_href.pop();
3963 }
3964 else if(document.getElementsByClassName("paged-nav-item").length>0){
3965 let arr=Array.from(document.getElementsByClassName("paged-nav-item"));
3966 for(let i=0;i<arr.length;i++)
3967 list_href.push({
3968 href:arr[i].getAttribute("href"),
3969 unignored:true
3970 })
3971 }
3972 else if(document.getElementById("incomings_table")!=null){
3973 list_href.push({
3974 href:incomings_href,
3975 unignored:true
3976 })
3977 }
3978
3979
3980 ///////////////////////////////////////////////////////////ignored attacks/support////////////////////////////////////////
3981 incomings_href=game_data.link_base_pure+"overview_villages&mode=incomings&type=ignored&subtype=all&group=0&page=-1";
3982
3983 console.log("currentLink")
3984 console.log(incomings_href)
3985 document.body.innerHTML=httpGet(incomings_href);
3986
3987
3988 if(document.getElementsByClassName("vis")[1].getElementsByTagName("select").length>0){
3989 Array.from(document.getElementsByClassName("vis")[1].getElementsByTagName("select")[0].options).forEach(el=>{
3990 list_href.push({
3991 href:el.value,
3992 unignored:false
3993 });
3994 })
3995 list_href.pop();
3996 }
3997 else if(document.getElementsByClassName("paged-nav-item").length>0){
3998 let arr=Array.from(document.getElementsByClassName("paged-nav-item"));
3999 for(let i=0;i<arr.length;i++)
4000 list_href.push({
4001 href:arr[i].getAttribute("href"),
4002 unignored:false
4003 })
4004 }
4005 else if(document.getElementById("incomings_table")!=null){
4006 list_href.push({
4007 href:incomings_href,
4008 unignored:false
4009 })
4010 }
4011
4012
4013
4014
4015
4016
4017
4018 console.log(list_href)
4019
4020
4021 var indexIncoming=1;
4022 var url_length=list_href.length
4023 var map_outgoing_support=new Map()
4024
4025 var list_incomingId=[]
4026 var map_exist_support=localStorage.getItem(game_data.world+"map_exist_support")
4027 if(map_exist_support!=undefined)
4028 map_exist_support=new Map(JSON.parse(map_exist_support))
4029 else
4030 map_exist_support=new Map()
4031
4032
4033 function ajaxRequest (urls) {
4034 let current_url,unignored
4035 var time=0
4036 if(urls.length>0){
4037 let obj=urls.pop();
4038 current_url=obj.href
4039 unignored=obj.unignored
4040 }
4041 else{
4042 current_url="stop"
4043 }
4044 console.log("in functie in plm "+urls.length)
4045 // console.log(current_url)
4046
4047 if (urls.length >= 0 && current_url!="stop") {
4048 var start_ajax=new Date();
4049 $.ajax({
4050 url: current_url,
4051 method: 'get',
4052 success: (data) => {
4053 document.body.innerHTML=data
4054 if(document.getElementById("incomings_table")==null)
4055 alert("turn off the filters");
4056 let table_incomings=document.getElementById("incomings_table").getElementsByTagName("tbody")[0].children
4057 for(let i=1;i<table_incomings.length-1;i++){
4058
4059 if(table_incomings[i].children[0].innerText!="--"){
4060 let commandId=table_incomings[i].getElementsByClassName("quickedit")[0].getAttribute("data-id")
4061
4062 console.log(commandId)
4063 list_incomingId.push(commandId)
4064 let coord_destination=table_incomings[i].children[1].innerText.match(/[0-9]{3}\|[0-9]{3}/)[0]
4065 let coord_origin=table_incomings[i].children[2].innerText.match(/[0-9]{3}\|[0-9]{3}/)[0]
4066 let coord_origin_id=table_incomings[i].children[2].getElementsByTagName("a")[0].href.split("id=")[1]
4067 let length_tr=table_incomings[i].children.length
4068 let landing_time=getLandTime(table_incomings[i].children[length_tr-2].innerText)
4069 let troops={}
4070 let player_origin_name=table_incomings[i].children[length_tr-4].innerText
4071 let player_origin_id=table_incomings[i].children[length_tr-4].getElementsByTagName("a")[0].href.split("id=")[1]
4072
4073
4074 let labelName="none"
4075 let type_attack=table_incomings[i].getElementsByClassName("quickedit")[0].getElementsByTagName("img")[0].src.split("command/")[1]
4076 if(table_incomings[i].children[0].getElementsByTagName("img").length==2){
4077 labelName=table_incomings[i].getElementsByClassName("quickedit")[0].getElementsByTagName("img")[1].src.split("tiny/")[1]
4078 if(labelName==undefined)
4079 labelName=table_incomings[i].getElementsByClassName("quickedit")[0].getElementsByTagName("img")[1].src.split("command/")[1]
4080
4081 }
4082
4083
4084 //check if an attack was ignored or unignored
4085 if(map_exist_support.has(commandId)){
4086 if(map_exist_support.get(commandId)!=unignored)
4087 map_exist_support.delete(commandId)
4088 }
4089
4090
4091 console.log(coord_destination)
4092 //add new command id to localstorage and save data to map_going_support
4093 if(!map_exist_support.has(commandId)){
4094
4095
4096 if(!map_outgoing_support.has(coord_destination)){
4097 map_outgoing_support.set(coord_destination,[{
4098 coord_destination:coord_destination,
4099 coord_origin:coord_origin,
4100 landing_time:landing_time,
4101 troops:troops,
4102 player_origin_name:player_origin_name,
4103 player_origin_id:player_origin_id,
4104 type_attack:type_attack,
4105 commandId:commandId,
4106 labelName:labelName,
4107 coord_origin_id:coord_origin_id,
4108 unignored:unignored
4109 }])
4110 console.log("list support doesn't exist")
4111 }
4112 else{
4113 let list_support=map_outgoing_support.get(coord_destination)
4114 list_support.push({
4115 coord_destination:coord_destination,
4116 coord_origin:coord_origin,
4117 landing_time:landing_time,
4118 troops:troops,
4119 player_origin_name:player_origin_name,
4120 player_origin_id:player_origin_id,
4121 type_attack:type_attack,
4122 commandId:commandId,
4123 labelName:labelName,
4124 coord_origin_id:coord_origin_id,
4125 unignored:unignored
4126 })
4127 map_outgoing_support.set(coord_destination,list_support)
4128 console.log("list support updated")
4129
4130 }
4131 map_exist_support.set(commandId,{
4132 unignored:unignored,
4133 playerId:game_data.player.id
4134 })
4135 }
4136
4137
4138 }
4139 }
4140
4141 UI.SuccessMessage(indexIncoming+"/"+url_length)
4142 indexIncoming++;
4143 var stop_ajax=new Date();
4144 var dif_time=stop_ajax.getTime()-start_ajax.getTime()
4145 console.log("wait: "+dif_time)
4146 window.setTimeout(function(){
4147 ajaxRequest (list_href)
4148 },200-dif_time)
4149 }
4150 })
4151
4152 }
4153 else
4154 {
4155 UI.SuccessMessage("done",2000)
4156 if(document.getElementById("incomings_table")!=null){
4157 // showButtons();
4158 }
4159
4160 if( document.getElementsByClassName("g-recaptcha").length>0){//recaptcha
4161 console.log("recapthca")
4162 UI.ErrorMessage("recapthca, upload again")
4163 resolve("recapthca, upload again");
4164 throw new Error("recapthca, upload again");
4165 }
4166
4167 window.setTimeout(function(){
4168 document.body.innerHTML=httpGet(current_href_incomings);
4169
4170
4171 Array.from(map_exist_support.keys()).forEach((key)=>{
4172 if(!list_incomingId.includes(key)){
4173 map_exist_support.delete(key)
4174 console.log("delete id: "+key)
4175 }
4176 })
4177
4178 resolve({
4179 map_outgoing_support:map_outgoing_support,
4180 map_exist_support:map_exist_support
4181 })
4182 },200)
4183
4184
4185
4186 }
4187 }
4188 if(list_href.length>0)
4189 ajaxRequest(list_href);
4190 else
4191 reject("error on incomings")
4192 })
4193}
4194
4195/////////////////////////////////////////////main function for getting all supports and attacks//////////////////////////////////////////
4196
4197async function uploadSupports(){
4198 var [mapVillage, data_support,data_attack,mapStatus]=await Promise.all([getInfoVIllages(), readFileDropbox(filename_support),readFileDropbox(filename_commands_attack),readFileDropbox(filname_status_upload)]).catch(err=>{alert(err)})
4199 var result_commands=await getCommandsGoing().catch(err=>{alert(err);throw err})
4200
4201 var map_going=result_commands[0]
4202 var map_going_attacks=result_commands[1]
4203 console.log("map_going_attacks",map_going_attacks)
4204
4205 var resultSupport=await getSupportsAndAttacks().catch(err=>{alert(err);throw err})
4206
4207 var map_coming=resultSupport.map_outgoing_support
4208 var map_troops_home=new Map()
4209
4210 //for each support coming get all troops
4211 var keys=Array.from(map_coming.keys())
4212 let start_get_troops=new Date().getTime()
4213 const run = async () => {
4214 console.log("Starting...");
4215 for (let i = 0; i < keys.length; i++) {
4216 let list_support=map_coming.get(keys[i])
4217 for(let j=0;j<list_support.length;j++){
4218 if(list_support[j].type_attack.includes("support")){
4219 let troops= await ajaxTroopsComing(list_support[j].commandId)
4220 // console.log(troops)
4221 list_support[j].troops=troops
4222 UI.SuccessMessage("info coord: "+(keys.length-i)+" , get troops coming "+(list_support.length-j))
4223 }
4224 else{//type_attack=="attack"
4225 try {//in case a barb is taken and tw database is not yet updated will throw an error
4226 let villageId=mapVillage.get(list_support[j].coord_destination).villageId
4227 if(!map_troops_home.has(list_support[j].coord_destination)){
4228 let obj = await ajaxTroopsStationed(villageId)
4229 // console.log("troops home")
4230 // console.log(obj)
4231
4232 let serverTime=document.getElementById("serverTime").innerText
4233 let serverDate=document.getElementById("serverDate").innerText.split("/")
4234 serverDate=serverDate[1]+"/"+serverDate[0]+"/"+serverDate[2]
4235 let date_current=new Date(serverDate+" "+serverTime)
4236 date_current.setDate(date_current.getDate()+7)
4237
4238 obj.uploadTime=date_current.getTime()
4239 map_troops_home.set(list_support[j].coord_destination,obj)
4240 UI.SuccessMessage("info coord: "+(keys.length-i)+" , get troops home "+(list_support.length-j))
4241
4242 }
4243 } catch (error) {
4244 console.log(error)
4245 }
4246
4247 }
4248 }
4249 map_coming.set(keys[i],list_support)
4250
4251
4252 }
4253 console.log("Done!");
4254 };
4255 await run();
4256 var stop_get_troops=new Date().getTime()
4257 console.log("time get troops "+(stop_get_troops-start_get_troops))
4258
4259 console.log("support outgoing")
4260 console.log(map_going)
4261 console.log("support coming")
4262 console.log(map_coming)
4263 console.log("troops home")
4264 console.log(map_troops_home)
4265
4266 //merge map_going and map_coming
4267 Array.from(map_going.keys()).forEach(key=>{
4268 let obj_going=map_going.get(key)
4269 if(map_coming.has(obj_going.coord_destination)){
4270 // console.log("map coming update coord")
4271 let list_coming=map_coming.get(obj_going.coord_destination)
4272 let commandIdNotExist=true
4273 for(let i=0;i<list_coming.length;i++){
4274 if(key==list_coming[i].commandId){
4275 commandIdNotExist=false;
4276 break;
4277 }
4278 }
4279 if(commandIdNotExist==true){
4280 list_coming.push(obj_going)
4281 map_coming.set(obj_going.coord_destination,list_coming)
4282 // console.log("command Id doesnt Exist")
4283 }
4284 }else{
4285 map_coming.set(obj_going.coord_destination,[obj_going])
4286 // console.log("map coming add coord")
4287
4288 }
4289
4290 })
4291 console.log("support coming after merge")
4292 console.log(map_coming)
4293
4294
4295
4296 let map_attack_dropbox
4297 /////////////////////////////////get and prelucrate map commands attacks//////////////
4298 if(data_attack=="[]"){
4299 map_attack_dropbox=new Map()
4300 }else{
4301 map_attack_dropbox=new Map(JSON.parse(lzw_decode(data_attack)))
4302 }
4303 console.log("map_going_attacks",map_going_attacks)
4304 Array.from(map_going_attacks.keys()).forEach(key=>{
4305 try {
4306 let obj=map_going_attacks.get(key)
4307 obj.coord_destination_id=mapVillage.get(obj.coord_destination).villageId
4308 obj.player_destination_name=mapVillage.get(obj.coord_destination).playerName
4309 obj.player_destination_id=mapVillage.get(obj.coord_destination).playerId
4310 map_attack_dropbox.set(key,obj)
4311 } catch (error) {
4312 console.log("command attack to barb")
4313 console.log(error)
4314 }
4315 })
4316
4317
4318
4319
4320 //extract data from dropbox, update and then upload
4321 let map_support_dropbox,map_troops_home_dropbox
4322 if(data_support=="[]"){
4323 map_support_dropbox=new Map()
4324 map_troops_home_dropbox=new Map()
4325 }else{
4326 map_support_dropbox=new Map(JSON.parse(lzw_decode(data_support))[0])
4327 map_troops_home_dropbox =new Map(JSON.parse(lzw_decode(data_support))[1])
4328 }
4329
4330 return new Promise(async(resolve,reject)=>{
4331
4332 console.log("map_dropbox_coming")
4333 console.log(map_support_dropbox)
4334 console.log("map_dropbox_home")
4335 console.log(map_troops_home_dropbox)
4336
4337
4338 let serverTime=document.getElementById("serverTime").innerText
4339 let serverDate=document.getElementById("serverDate").innerText.split("/")
4340 serverDate=serverDate[1]+"/"+serverDate[0]+"/"+serverDate[2]
4341 let date_current=new Date(serverDate+" "+serverTime).getTime()
4342 let date_current_commands=new Date(serverDate+" "+serverTime)
4343
4344
4345
4346 map_troops_home_dropbox=new Map([...map_troops_home_dropbox, ...map_troops_home])
4347 console.log("map_troops_home_dropbox merge")
4348 console.log(map_troops_home_dropbox)
4349 //delete from map troops home if it's older than a week
4350 Array.from(map_troops_home_dropbox.keys()).forEach(key=>{
4351 if(date_current>map_troops_home_dropbox.get(key).uploadTime){
4352 map_troops_home_dropbox.delete(key)
4353 }
4354 })
4355
4356
4357 // update map from dropbox with the new data
4358 Array.from(map_coming.keys()).forEach(key=>{
4359 let list_coming=map_coming.get(key)
4360 if(map_support_dropbox.has(key)){
4361 let list_dropbox=map_support_dropbox.get(key)
4362 list_dropbox=list_dropbox.concat(list_coming)
4363 var list_concat =[...new Map(list_dropbox.map(item => [item["commandId"], item])).values()]
4364 console.log("list concat")
4365 list_concat.sort((o1,o2)=>{
4366 return (new Date(o1.landing_time).getTime()>new Date(o2.landing_time).getTime())?1:
4367 (new Date(o1.landing_time).getTime()<new Date(o2.landing_time).getTime())?-1:0
4368 })
4369 console.log(list_concat)
4370 if(list_concat.length==0){
4371 map_support_dropbox.delete(key)
4372 console.log("list is empty, removed")
4373 }
4374 else
4375 map_support_dropbox.set(key,list_concat)
4376 }
4377 else{
4378 console.log("list coming")
4379 list_coming.sort((o1,o2)=>{
4380 return (new Date(o1.landing_time).getTime()>new Date(o2.landing_time).getTime())?1:
4381 (new Date(o1.landing_time).getTime()<new Date(o2.landing_time).getTime())?-1:0
4382 })
4383 console.log(list_coming)
4384 map_support_dropbox.set(key,list_coming)
4385 }
4386 })
4387
4388
4389 //if a command arrived delete from map
4390 Array.from(map_support_dropbox.keys()).forEach(key=>{
4391 let list_support=map_support_dropbox.get(key)
4392 console.log(list_support)
4393 if(list_support.length==0){
4394 map_support_dropbox.delete(key)
4395 console.log("delete coord from map support dropbox")
4396 }
4397 else{
4398 for(let i=0;i<list_support.length;i++){
4399 let date_land=new Date(list_support[i].landing_time).getTime()
4400 if(date_current>date_land){
4401 list_support.splice(i,1)
4402 i--;
4403 }
4404 }
4405 map_support_dropbox.set(key,list_support)
4406 }
4407
4408 })
4409
4410 //delete map commands attacks if it's older than 1 week
4411 Array.from(map_attack_dropbox.keys()).forEach(key=>{
4412 let obj=map_attack_dropbox.get(key)
4413 let date_upload=new Date(obj.uploadTime).getTime()
4414
4415 if(date_current > date_upload)
4416 map_attack_dropbox.delete(key)
4417 })
4418
4419
4420 //update status map
4421 let obj_status={
4422 name:game_data.player.name,
4423 command_date:date_current_commands,
4424 }
4425
4426
4427 if(mapStatus=="[]")
4428 mapStatus=new Map()
4429 else
4430 mapStatus=new Map(JSON.parse(mapStatus))
4431
4432 if(mapStatus.has(game_data.player.id)){
4433 let obj_update=mapStatus.get(game_data.player.id)
4434 mapStatus.set(game_data.player.id, {...obj_update, ...obj_status} )
4435 }
4436 else{
4437 mapStatus.set(game_data.player.id,obj_status)
4438 }
4439
4440
4441
4442 UI.SuccessMessage("compressing database, wait few seconds",2000)
4443 let data_list=[Array.from(map_support_dropbox.entries()),Array.from(map_troops_home_dropbox.entries())]
4444 data_list=JSON.stringify(data_list)
4445 data_list=replaceSpecialCaracters(data_list)
4446 data_list=lzw_encode(data_list)
4447 console.log("upload supports")
4448
4449 console.log("map_attack_dropbox",map_attack_dropbox)
4450 let data_commands_attacks=lzw_encode(JSON.stringify(Array.from(map_attack_dropbox.entries())))
4451 let data_status=JSON.stringify(Array.from(mapStatus.entries()))
4452
4453 addWindow();
4454 showButtons();
4455
4456 let result_support=await uploadFile(data_list,filename_support,dropboxToken).catch(err=>alert(err))
4457 let result_attacks=await uploadFile(data_commands_attacks,filename_commands_attack,dropboxToken).catch(err=>alert(err))
4458 let result_Status=await uploadFile(data_status,filname_status_upload,dropboxToken).catch(err=>alert(err))
4459
4460 if(result_support=="succes"){
4461 document.getElementById("progress_support").innerText=map_coming.size+" coords"
4462 document.getElementById("progress_all").innerText="done";
4463 var data=JSON.stringify(Array.from(resultSupport.map_exist_support.entries()))
4464 localStorage.setItem(game_data.world+"map_exist_support",data)
4465 UI.SuccessMessage("upload commands done","slow")
4466 resolve("succes")
4467 }
4468 else{
4469 reject("error")
4470 }
4471 })
4472
4473}
4474
4475/////////////////////////////////////////////get troops coming from each village on incomings page//////////////////////////////////////////
4476
4477
4478function ajaxTroopsComing(commandId){
4479 return new Promise((resolve,reject)=>{
4480 let units=game_data.units.slice()
4481 if(units.includes("militia")){
4482 units.pop()
4483 }
4484
4485 let startAjax=new Date().getTime()
4486 $.ajax({
4487 url: game_data.link_base_pure+`info_command&ajax=details&id=${commandId}`,
4488 method: 'get',
4489 success: (data) => {
4490 let troops={}
4491 if(data.units!=undefined){
4492 troops=data.units
4493 Object.keys(troops).forEach(key=>{
4494 troops[key]=parseInt(troops[key].count)
4495 })
4496 }
4497 else{
4498 Object.keys(units).forEach(key=>{
4499 troops[units[key]]=0
4500 })
4501 }
4502 let stopAjax=new Date().getTime()
4503 let difAjax=stopAjax-startAjax
4504 console.log("wait ",difAjax)
4505 window.setTimeout(()=>{
4506 resolve(troops)
4507 },200-difAjax)
4508
4509 },error:(data)=>{
4510 reject(data)
4511 }
4512
4513 })
4514 })
4515}
4516
4517
4518/////////////////////////////////////////////get troops at home from each village on incomings page//////////////////////////////////////////
4519
4520function ajaxTroopsStationed(villageId){
4521 return new Promise((resolve,reject)=>{
4522
4523 let startAjax=new Date().getTime()
4524 $.ajax({
4525 url:game_data.link_base_pure + `map&ajax=map_info&source=${villageId}&target=${villageId}&`,
4526 method: 'get',
4527 success: (response) => {
4528 // console.log(response)
4529 let units=game_data.units
4530 let obj_troops={}
4531 let obj_result={}
4532 for(let i=0;i<units.length-1;i++){
4533 obj_troops[units[i]]=parseInt(response.units[units[i]].count.home)+parseInt(response.units[units[i]].count.foreign)
4534 }
4535 let wallLevel,farmLevel,flagName,LoyaltyLevel
4536 wallLevel=response.buildings.wall
4537 farmLevel=response.buildings.farm
4538 LoyaltyLevel=response.mood
4539 // console.log(response.flag)
4540 if(response.flag!=undefined)
4541 flagName =response.flag.short_desc
4542 else
4543 flagName="none"
4544 // console.log(obj_troops)
4545 // console.log("wallLevel: "+wallLevel)
4546 // console.log("farmLevel: "+farmLevel)
4547 // console.log("flagName: "+flagName)
4548 // console.log("LoyaltyLevel: "+LoyaltyLevel)
4549
4550 obj_result.obj_troops=obj_troops
4551 obj_result.wallLevel=wallLevel
4552 obj_result.farmLevel=farmLevel
4553 obj_result.flagName=flagName
4554 obj_result.LoyaltyLevel=LoyaltyLevel
4555
4556
4557 let stopAjax=new Date().getTime()
4558 let difAjax=stopAjax-startAjax
4559 console.log("wait ",difAjax)
4560 window.setTimeout(()=>{
4561 resolve(obj_result)
4562 },200-difAjax)
4563
4564 },error:(data)=>{
4565 reject(data)
4566 }
4567
4568 })
4569
4570 })
4571}
4572
4573
4574
4575//////////////////////////////////////////////main table + all the logic for creating main table///////////////////////////////////////////////
4576
4577async function viewSupport(){
4578 if(document.getElementById("div_container")!=null)
4579 document.getElementById("div_container").remove();
4580 ///////////////////////////////////////////////////////////////////main table//////////////////////////////////////////////////////////
4581 let html_info=`
4582 <div id="div_container_view" class="ui-widget-content div_remove" style="width:900px;background-color:${backgroundColor};cursor:move;z-index:50;">
4583 <div class="close-btn" class="btn_close" onclick="closeWindow()" style="position:absolute;top:10px;right: 10px;"><b><a href=#><font color="${titleColor}">X</font></b></a></div>
4584
4585 <div id="minimize_page" style="position:absolute;top:10px;left:850px;background-color:white"><a href="#"><img src="https://img.icons8.com/material-outlined/16/000000/collapse.png"/></a></div>
4586
4587 <div id="page_main" style="position:absolute;top:10px;left: 10px;" ><a href="#"><img src="https://img.icons8.com/officel/30/000000/long-arrow-left.png"/></a></div>
4588 <h2><center style="margin:10px"><u><font color="${titleColor}">View incomings</font></u></center></h2>
4589 <div id="div_minimize">
4590 <input class="btn evt-confirm-btn btn-confirm-yes" type="button" onclick="createTableSettings()" style="margin:10px" value="Settings">
4591 <input class="btn evt-confirm-btn btn-confirm-yes" type="button" id="btn_rank_attacker" style="margin:10px" value="Rank attackers">
4592 <input class="btn evt-confirm-btn btn-confirm-yes" type="button" id="btn_rank_defender" style="margin:10px" value="Rank defenders">
4593 <input class="btn evt-confirm-btn btn-confirm-yes" type="button" id="btn_upload_time" style="margin:10px" value="Upload time">
4594 <div id="div_settings" style="margin:10px" hidden> </div>
4595 <div id="div_rank" style="margin:10px" hidden> </div>
4596 <div id="div_rank_attacker" style="margin:10px" hidden> </div>
4597 <div id="div_rank_defender" style="margin:10px" hidden> </div>
4598 <div id="div_upload_time" style="margin:10px" hidden> </div>
4599
4600 <div style="display:flex;justify-content: center;width:100%">
4601 <div style="width: 45%;margin:15px">
4602 <table id="table_search" border="1" style="width: 100%;background-color:${backgroundColor};border-color:${borderColor};">
4603 <tr>
4604 <td style="text-align:center; width:auto; background-color:${headerColor}">
4605 <center style="margin:5px"><font color="${titleColor}"><p>search by coord</p></font></center>
4606 </td>
4607 <td style="text-align:center; width:auto; background-color:${headerColor}">
4608 <center style="margin:5px"> <input id="input_search" type="text" style="margin:10px" placeholder="coord"></center>
4609 </td>
4610 </tr>
4611 </table>
4612 </div>
4613 <div style="width: 45%;margin:15px" >
4614 <table id="table_select_info" border="1" style="width: 100%;background-color:${backgroundColor};border-color:${borderColor};" hidden>
4615 <tr>
4616 <td style="text-align:center; width:auto; background-color:${headerColor};text-align:left">
4617 <input style="margin:5px" type="radio" id="radio_offensive" name="type_info" value="offensive_info">
4618 <label for="radio_offensive" style="color:${titleColor};text-align:left;margin:5px">offensive info</label><br>
4619 <input style="margin:5px" type="radio" id="radio_defensive" name="type_info" value="defensive_info" >
4620 <label for="radio_defensive" style="color:${titleColor};text-align:left;margin:5px">defensive info</label><br>
4621
4622 </td>
4623 <td style="text-align:center; width:auto; background-color:${headerColor}">
4624 <select id="select_player">
4625 </select>
4626 </td>
4627 <td style="text-align:center; width:auto; background-color:${headerColor}">
4628 <center><input class="btn evt-confirm-btn btn-confirm-yes" type="button" id="btn_show_info" style="margin:10px" value="show"></center>
4629 </td>
4630 </tr>
4631
4632 </table>
4633 </div>
4634 </div>
4635
4636 <br>
4637
4638 <table id="table_view" class="" border="1" style="width: 100%;background-color:${backgroundColor};border-color:${borderColor};border-spacing:2px;border-collapse:separate;">
4639 <thead>
4640 <tr>
4641 <td style="text-align:center; width:auto; background-color:${headerColor}" colspan="2">
4642 <center style="margin:1px"><font color="${titleColor}">total</font></center>
4643 </td>
4644 <td style="text-align:center; width:auto; background-color:${headerColor}">
4645 <center style="margin:1px;font-size:16px"><font color="${titleColor}"><a href="#"><img src="https://dsen.innogamescdn.com/asset/4ba99e83/graphic/unit/att.png" id="sort_by_attacks"></a><p id="header_attacks">(0)</p></font></center>
4646 </td>
4647 <td style="text-align:center; width:auto; background-color:${headerColor}">
4648 <center style="margin:1px;font-size:16px"><font color="${titleColor}"><a href="#"><img src="https://dsen.innogamescdn.com/asset/a9e85669/graphic/command/support.png" id="sort_by_supports"></a><p id="header_supports">(0)</p></font></center>
4649 </td>
4650 <td style="text-align:center; width:auto; background-color:${headerColor}">
4651 <center style="margin:1px;font-size:16px"><font color="${titleColor}"><a href="#"><img src="https://dsen.innogamescdn.com/asset/a9e85669/graphic/command/snob.png" id="sort_by_nobles"></a><p id="header_nobles">(0)</p></font></center>
4652 </td>
4653 <td style="text-align:center; width:auto; background-color:${headerColor}">
4654 <center style="margin:1px;font-size:16px"><font color="${titleColor}"><a href="#"><img src="https://img.icons8.com/office/20/000000/sniper-rifle.png" id="sort_by_snipes"></a><p id="header_snipes">(0/0)</p></font></center>
4655 </td>
4656 <td style="text-align:center; width:auto; background-color:${headerColor}">
4657 <center style="margin:1px;font-size:16px"><font color="${titleColor}"><a href="#"><img src="https://img.icons8.com/ultraviolet/20/000000/horror.png" id="sort_by_recaps"></a><p id="header_recaps">(0/0)</p></font></center>
4658 </td>
4659 </tr>
4660 </thead>
4661 </table>
4662 </div>
4663 </div>
4664
4665 `;
4666
4667 $("#div_container_view").remove()
4668 $("#contentContainer").eq(0).prepend(html_info);
4669 $("#mobileContent").eq(0).prepend(html_info);
4670
4671 if(game_data.device=="desktop"){
4672 $("#div_container_view").css("position","fixed");
4673 $("#div_container_view").draggable();
4674 }
4675 document.getElementById("page_main").addEventListener("click",()=>{
4676 $("#div_container_view").remove()
4677 $("#contentContainer").eq(0).prepend(html);
4678 $("#mobileContent").eq(0).prepend(html);
4679
4680 if(game_data.device=="desktop"){
4681 $("#div_container").css("position","fixed");
4682 $("#div_container").draggable();
4683 }
4684
4685 })
4686 document.getElementById("minimize_page").addEventListener("click",()=>{
4687 $("#div_minimize").toggle(500)
4688 })
4689 if(typeof(TWMap)!="undefined"){
4690 $("#table_select_info").show()
4691 }
4692
4693
4694
4695
4696
4697 let [mapVillage, map_reports,data,map_attacks,map_status]=await Promise.all([getInfoVIllages(), readFileDropbox(filename_reports),readFileDropbox(filename_support),readFileDropbox(filename_commands_attack),readFileDropbox(filname_status_upload)]).catch(err=>{alert(err)})
4698 map_reports=new Map(JSON.parse(lzw_decode(map_reports)))
4699 map_attacks=new Map(JSON.parse(lzw_decode(map_attacks)))
4700 map_status=new Map(JSON.parse(lzw_decode(map_status)))
4701
4702
4703 let map_coming=new Map(JSON.parse(lzw_decode(data))[0])
4704 let map_home=new Map(JSON.parse(lzw_decode(data))[1])
4705 let map_playerId=new Map()
4706 console.log("map_coming",map_coming)
4707 console.log("map_home",map_home)
4708 console.log("map_reports",map_reports)
4709 console.log("map_attacks",map_attacks)
4710
4711
4712
4713 let serverTime=document.getElementById("serverTime").innerText
4714 let serverDate=document.getElementById("serverDate").innerText.split("/")
4715 serverDate=serverDate[1]+"/"+serverDate[0]+"/"+serverDate[2]
4716 let date_current=new Date(serverDate+" "+serverTime).getTime()
4717 createTableSettings()
4718 $("#div_settings").hide()
4719
4720 let pop_snipe=parseInt(document.getElementById("settings_pop").value)
4721 if(Number.isNaN(pop_snipe))
4722 pop_snipe=1000
4723
4724
4725 //filters
4726 let list_filters=[]
4727 $('#div_settings input[type=checkbox]:checked').each(function (index,elem) {
4728
4729 list_filters.push(elem.value)
4730 console.log(elem.value)
4731
4732 });
4733 // console.log("list_filters",list_filters)
4734
4735 Array.from(map_coming.keys()).forEach(key=>{
4736 try {
4737 let obj_output={}
4738 let playerId=mapVillage.get(key).playerId
4739 console.log(playerId)
4740 let villageId=mapVillage.get(key).villageId
4741 let playerName=mapVillage.get(key).playerName
4742
4743 let list_coming=map_coming.get(key)
4744 let hasAttacks=false
4745 let nr_attacks=0,nr_supports=0,nr_nobles=0;
4746 let snipe=false,sniped=false,recap=false,recaped=false;
4747
4748 if(tribemates.includes(playerName.toLowerCase())){
4749 // console.log("list_coming",list_coming)
4750 //filter incomings
4751 for(let i=0;i<list_coming.length;i++){
4752 let landing_time=new Date(list_coming[i].landing_time).getTime()
4753 let deleteIncoming=false
4754 //remove if there is an ignored attack/support
4755 if(list_filters.includes("hide_ignored") && list_coming[i].unignored==false){
4756 deleteIncoming=true
4757 console.log("delete ignored attack")
4758 }
4759 //remove if there is a support
4760 if(list_filters.includes("hide_supports") && list_coming[i].type_attack.includes("support")){
4761
4762 let landing_time_current=new Date(list_coming[i].landing_time).getTime()
4763 for(let j=i+1;j<list_coming.length-1;j++){
4764 let landing_time_next=new Date(list_coming[j].landing_time).getTime()//that means there a support which lands with no more than 600 ms before an attack
4765 if(landing_time_next-landing_time_current>600){
4766 deleteIncoming=true
4767 console.log("delete support")
4768 break
4769 }
4770 else
4771 break;
4772 }
4773
4774 if(i==list_coming.length-1){//if last incoming is a support then delete
4775 deleteIncoming=true
4776 console.log("delete support")
4777 }
4778
4779
4780
4781 }
4782 // remove if there is an attack/support further than x hours away
4783 if(list_filters.includes("hide_further_attacks")){
4784 let hours=parseInt(document.getElementById("settings_further").value)*3600*1000
4785 if(Number.isNaN(hours))
4786 hours=100*3600*1000
4787 if((landing_time-date_current)>hours){
4788 deleteIncoming=true
4789 console.log("delete further attacks")
4790 }
4791 }
4792 // remove if there is an attack/support closer than x hours away
4793 if(list_filters.includes("hide_closer_attacks")){
4794 let hours=parseInt(document.getElementById("settings_closer").value)*3600*1000
4795 if(Number.isNaN(hours))
4796 hours=10*3600*1000
4797 if((landing_time-date_current)<hours){
4798 deleteIncoming=true
4799 console.log("delete closer attacks")
4800 }
4801 }
4802
4803 //remove if an attack/def was sent and uploaded to dropbox but then the attacker withdraw his command
4804 if(playerId==game_data.player.id){
4805 let map_exist_command=new Map(JSON.parse(localStorage.getItem(game_data.world+"map_exist_support")))
4806 let keys_commandId=Array.from(map_exist_command.keys())
4807 if(!keys_commandId.includes(list_coming[i].commandId)){// it means there is a command and in localstorage it is not
4808 deleteIncoming=true
4809 console.log("delete withdrawn command")
4810
4811 }
4812 }
4813
4814
4815 //check if is a small/medium/big attack or a support
4816 let coord_origin=list_coming[i].coord_origin
4817 let playerId_origin=list_coming[i].player_origin_id
4818 if(map_reports.has(coord_origin) && list_coming[i].type_attack.includes("attack") )
4819 {
4820 let idPlayer_dropbox
4821 let type_dropbox
4822 let nr_troupes_dropbox
4823
4824 let obj_report=map_reports.get(coord_origin);
4825 var traveling=false
4826 if(coord_origin == obj_report.coordAttacker){
4827 idPlayer_dropbox=obj_report.attackingPlayerId;
4828 type_dropbox=obj_report.typeAttacker;
4829 nr_troupes_dropbox=obj_report.nrTroupesAttacker
4830 traveling=true;
4831 }
4832 else if(coord_origin == obj_report.coordDefender){
4833 idPlayer_dropbox=obj_report.defendingPlayerId;
4834 type_dropbox=obj_report.typeDefender;
4835 nr_troupes_dropbox=obj_report.nrTroupesDefender
4836 traveling=false;
4837 }
4838 else{
4839 idPlayer_dropbox=obj_report.supporterPlayerId
4840 type_dropbox=obj_report.typeSupporter;
4841 nr_troupes_dropbox=obj_report.nrTroupesSupporter
4842 }
4843
4844 if(idPlayer_dropbox == playerId_origin)
4845 {
4846
4847 //calculate population
4848 let date_landing_report=new Date(obj_report.time_report)
4849 let distance=calcDistance(coord_origin,list_coming[i].coord_destination)
4850 let time_attack=0;
4851
4852 let date_land=new Date(landing_time)
4853 // console.log(date_land)
4854 let labelName=list_coming[i].labelName
4855
4856
4857 if(labelName.includes("snob.png")){
4858 time_attack=nobleSpeed*distance
4859 }else if(labelName.includes("ram.png") || labelName.includes("catapult.png")){
4860 time_attack=ramSpeed*distance
4861 }else if(labelName.includes("sword.png")){
4862 time_attack=swordSpeed*distance
4863 }else if(labelName.includes("axe.png")){
4864 time_attack=axeSpeed *distance
4865 }
4866 if(traveling==false)
4867 time_attack=0;
4868
4869 let newTypeAttack=list_coming[i].type_attack
4870 if(type_dropbox=="off"){
4871 let timeForRecruiting = (date_land.getTime()-time_attack)-date_landing_report.getTime()
4872 let pop_small_attack=(parseInt(document.getElementById("settings_small_attack").value)/20000)*100
4873 let pop_medium_attack=(parseInt(document.getElementById("settings_medium_attack").value)/20000)*100
4874
4875 if(pop_medium_attack<pop_small_attack)
4876 alert("pop for medium attacks must be higher than pop for small attacks")
4877 if(Number.isNaN(pop_small_attack))
4878 pop_small_attack=(5000/20000)*100
4879 if(Number.isNaN(pop_medium_attack))
4880 pop_small_attack=(10000/20000)*100
4881
4882 // console.log("time for recruiting",timeForRecruiting)
4883 // console.log("nr_troupes_dropbox",nr_troupes_dropbox)
4884 nr_troupes_dropbox=calcProductionTroupes(timeForRecruiting,nr_troupes_dropbox)
4885 // console.log("nr_troupes_dropbox",nr_troupes_dropbox)
4886 // console.log(list_coming[i])
4887 if(nr_troupes_dropbox <= pop_small_attack)
4888 newTypeAttack="attack_small.png"
4889 else if(nr_troupes_dropbox >pop_small_attack && nr_troupes_dropbox <= pop_medium_attack )
4890 newTypeAttack="attack_medium.png"
4891 else
4892 newTypeAttack="attack_large.png"
4893
4894 }
4895 else if(type_dropbox.includes("def")){
4896 newTypeAttack="def"
4897 }
4898 list_coming[i].type_attack=newTypeAttack
4899 }
4900 }
4901
4902
4903
4904 //delete if filters is on
4905 if(deleteIncoming==true){
4906 list_coming.splice(i,1);
4907 i--;
4908 }
4909
4910 }
4911
4912
4913 //counting attacks,supports, nobles, snipes, recaps
4914
4915 for(let i=0;i<list_coming.length;i++){
4916 let landing_time=new Date(list_coming[i].landing_time).getTime()
4917 if(landing_time>date_current){
4918 if(list_coming[i].type_attack.includes("attack")){
4919 nr_attacks++
4920 hasAttacks=true
4921 }
4922 else{
4923 nr_supports++
4924 }
4925 if(list_coming[i].labelName.includes("snob")){
4926 nr_nobles++
4927
4928 //check for train and if exist check for snipe
4929 for(let j=i+1;j<list_coming.length;j++){
4930 let landing_time_next=new Date(list_coming[j].landing_time).getTime()
4931 if(landing_time_next-landing_time==50 ||landing_time_next-landing_time==100 || landing_time_next-landing_time==150)
4932 {
4933 if(list_coming[i].coord_origin==list_coming[j].coord_origin )//there is a train
4934 {
4935 let pop=0;
4936 let list_snipe_support=[]
4937 for(let k=j-1;k>=0;k--){
4938
4939 if(list_coming[k].type_attack.includes("support")){//there is a snipe(support before second noble),check every support from left
4940 let troops=list_coming[k].troops
4941 Object.keys(troops).forEach(key=>{
4942 pop+=troops[key]*troopsPop[key]
4943 })
4944 list_snipe_support.push(k)
4945 }
4946 else{
4947 break
4948 }
4949 }
4950 if(pop>pop_snipe){
4951 sniped=true
4952 //this support is used for sniping and will be colored later
4953 for(let k=0;k<list_snipe_support.length;k++){
4954 list_coming[list_snipe_support[k]].hasSupportSnipe=true
4955 }
4956 }
4957 snipe=true
4958 }
4959 }
4960 }
4961 //check if needs to be recaped
4962 if(snipe==false && nr_nobles>=4){
4963 recap=true
4964 }
4965 //check if it recaped buy someone from your tribe
4966 if(snipe==false && nr_nobles>=4 && tribemates.includes(list_coming[i].player_origin_name)){
4967 recaped=true
4968 }
4969 }
4970 }
4971 }
4972
4973
4974
4975 if(hasAttacks==true){
4976 obj_output.homeInfo=map_home.get(key)
4977 }
4978 let nr_snipe=(snipe==true)?1:0
4979 let nr_sniped=(sniped==true)?1:0
4980 let nr_recap=(recap==true)?1:0
4981 let nr_recaped=(recaped==true)?1:0
4982
4983 obj_output.coord_destination_id=villageId
4984 obj_output.list_coming=list_coming
4985
4986 obj_output.nr_attacks=nr_attacks
4987 obj_output.nr_supports=nr_supports
4988 obj_output.nr_nobles=nr_nobles
4989
4990 obj_output.nr_snipe=nr_snipe
4991 obj_output.nr_sniped=nr_sniped
4992 obj_output.nr_recap=nr_recap
4993 obj_output.nr_recaped=nr_recaped
4994
4995 console.log("status snipe/recap")
4996 console.log(key)
4997 console.log(nr_snipe,nr_sniped,nr_recap,nr_recaped)
4998
4999 if(!map_playerId.has(playerId) && (nr_attacks>0 || nr_supports>0)){
5000
5001 map_playerId.set(playerId,{
5002 nr_attacks_total:nr_attacks,
5003 nr_supports_total:nr_supports,
5004 nr_nobles_total:nr_nobles,
5005 list_coords:[obj_output],
5006 player_destination_name:playerName,
5007 player_destination_id:playerId,
5008 nr_snipe_total:nr_snipe,
5009 nr_sniped_total:nr_sniped,
5010 nr_recap_total:nr_recap,
5011 nr_recaped_total:nr_recaped
5012 })
5013 }
5014 else{
5015 let obj_update=map_playerId.get(playerId)
5016 let list=obj_update.list_coords
5017 list.push(obj_output)
5018
5019 obj_update.list_coords=list
5020 obj_update.nr_attacks_total+=nr_attacks
5021 obj_update.nr_supports_total+=nr_supports
5022 obj_update.nr_nobles_total+=nr_nobles
5023 obj_update.nr_snipe_total+=nr_snipe,
5024 obj_update.nr_sniped_total+=nr_sniped,
5025 obj_update.nr_recap_total+=nr_recap,
5026 obj_update.nr_recaped_total+=nr_recaped
5027
5028 map_playerId.set(playerId,obj_update)
5029
5030 }
5031
5032 }
5033 } catch (error) {
5034 console.log(error)
5035 }
5036
5037
5038
5039 })
5040 console.log(map_playerId)
5041
5042
5043
5044
5045 //sort table players by attacks
5046 map_playerId= new Map([...map_playerId.entries()].sort((o1,o2) =>{
5047 return (o1[1].nr_attacks_total>o2[1].nr_attacks_total)?-1:(o1[1].nr_attacks_total<o2[1].nr_attacks_total)?1:0;
5048 }))
5049 //sort tables for each coord by attacks
5050 Array.from(map_playerId.keys()).forEach(key=>{
5051 let obj=map_playerId.get(key)
5052 obj.list_coords.sort((o1,o2)=>{
5053 return (o1.nr_attacks>o2.nr_attacks)?-1:(o1.nr_attacks<o2.nr_attacks)?1:0
5054 })
5055 map_playerId.set(key,obj)
5056 })
5057
5058
5059 console.log(map_playerId)
5060
5061
5062
5063 /////////////////////////////////////////////////////////////////////////////////players table//////////////////////////////////////////////////////////
5064 createTablePlayers(map_playerId,mapVillage)
5065 sortInfoIncomings(map_playerId,mapVillage)
5066
5067
5068 //add event for search input
5069 $("#input_search").on("input",(event)=>{
5070 let text_input=event.target
5071 if(text_input.value!=undefined){
5072 if(text_input.value.match(/[0-9]{3}\|[0-9]{3}/)!=null){
5073 let coord=text_input.value.match(/[0-9]{3}\|[0-9]{3}/)[0]
5074 text_input.value=coord
5075 console.log(coord)
5076 let playerId=mapVillage.get(coord).playerId
5077 let villageId=mapVillage.get(coord).villageId
5078
5079 if($(`.table_player img[coord-id=${villageId}]`).is(":visible")==false)
5080 $(`#table_view img[player-id=${playerId}]`).click();
5081
5082 if($(`.table_coord img[coord-id=${villageId}]`).is(":visible")==false)
5083 $(`.table_player img[coord-id=${villageId}]`).click();
5084
5085
5086 }
5087 }
5088 })
5089
5090
5091
5092 ///////////////////////////////////////////////////////////on map page///////////////////////////////////////////////////////////////////////////////////
5093
5094 let fangs_cat=parseInt(document.getElementById("settings_fang_cat").value)
5095 let pop_small_attack=parseInt(document.getElementById("settings_small_attack").value)
5096 let pop_medium_attack=parseInt(document.getElementById("settings_medium_attack").value)
5097 pop_small_attack=(!Number.isNaN(pop_medium_attack))?pop_medium_attack:5000
5098 pop_medium_attack=(!Number.isNaN(pop_medium_attack))?pop_medium_attack:10000
5099 fangs_cat=(!Number.isNaN(fangs_cat))?fangs_cat:100
5100
5101 //create a map with commands attacks, every coord has number of fangs,nukes,nobles
5102 //this part is for offensive info
5103
5104
5105 let mapVillageByIdFinal=new Map()
5106 let mapAttacksPlayersIdFinal=new Map()
5107
5108 Array.from(map_reports.keys()).forEach(key=>{
5109 let obj_report=map_reports.get(key)
5110
5111 let villageId=mapVillage.get(key).villageId
5112 let player_destination_name=mapVillage.get(key).playerName
5113 let player_destination_id=mapVillage.get(key).playerId
5114 let time_report=obj_report.time_report
5115
5116 //get troops at home
5117 let troopsAtHome=null,time_report_home=null
5118 if(obj_report["troopsAtHome_"+key]!=undefined){
5119 troopsAtHome=obj_report["troopsAtHome_"+key]
5120 time_report_home=obj_report["time_report_home_"+key]
5121
5122 }
5123
5124
5125 //get troops away
5126 let troopsAway=[]
5127 let type_village=null
5128 if(key==obj_report.coordAttacker){
5129 for(let i=0;i<obj_report.attackingArmy.length;i++){
5130 troopsAway.push({
5131 type:obj_report.attackingArmy[i].type,
5132 count:obj_report.attackingArmy[i].count - obj_report.attackingArmyLosses[i].count
5133 })
5134 }
5135 //type_village
5136 if(obj_report.typeAttacker.includes("off")){
5137 type_village="light"
5138 }
5139 else if(obj_report.typeAttacker=="spy"){
5140 type_village="spy"
5141 }
5142 else if(obj_report.typeAttacker.includes("def")){
5143 type_village="sword"
5144 }
5145
5146 }
5147 else if(key==obj_report.coordDefender && obj_report.travelingTroops != undefined){
5148 Object.keys(obj_report.travelingTroops).forEach(key=>{
5149 troopsAway.push({
5150 type:key,
5151 count:obj_report.travelingTroops[key]
5152 })
5153 })
5154
5155 //type_village
5156 if(obj_report.typeDefender.includes("off")){
5157 type_village="light"
5158 }
5159 else if(obj_report.typeDefender=="spy"){
5160 type_village="spy"
5161 }
5162 else if(obj_report.typeDefender.includes("def")){
5163 type_village="sword"
5164 }
5165 }
5166
5167 mapVillageByIdFinal.set(villageId,{
5168 nr_fangs:0,
5169 nr_nobles:0,
5170 nr_nukes:0,
5171 player_destination_id:player_destination_id,
5172 player_destination_name:player_destination_name,
5173 time_report:time_report,
5174 time_report_home:time_report_home,
5175 troopsAtHome:troopsAtHome,
5176 troopsAway:troopsAway,
5177 type_village:type_village,
5178 villageId:villageId,
5179 })
5180
5181 mapAttacksPlayersIdFinal.set(player_destination_id,player_destination_name)
5182
5183 })
5184
5185 let map_ranking_attacker=new Map()
5186 let map_ranking_defender=new Map()
5187 let mapAttacksVillageId=new Map()
5188 let mapAttacksPlayersId=new Map()
5189 Array.from(map_attacks.keys()).forEach(key=>{//go through each command attack
5190 let obj=map_attacks.get(key)
5191 let date_landing=new Date(obj.landing_time).getTime()
5192 let type_attack=obj.type_attack
5193
5194 let coord=obj.coord_destination
5195 let villageId=obj.coord_destination_id
5196
5197 let player_destination_id=obj.player_destination_id
5198 let player_destination_name=obj.player_destination_name
5199
5200 let player_origin_name=obj.player_origin_name
5201 let player_origin_id=obj.player_origin_id
5202
5203 let troops = obj.troops
5204 let fang=0,nuke=0,noble=0,fake=0
5205
5206
5207 let troopsAtHome=null,time_report_home=null
5208 let troopsAway=null, time_report=null
5209 let type_village=null
5210 if(map_reports.has(coord)){
5211 let obj_report=map_reports.get(coord)
5212 // console.log("obj_report",obj_report)
5213
5214
5215 //troops at home
5216 if(obj_report["troopsAtHome_"+coord]!=undefined){
5217 troopsAtHome=obj_report["troopsAtHome_"+coord]
5218 time_report_home=obj_report["time_report_home_"+coord]
5219 }
5220
5221
5222 //troops away
5223 time_report=obj_report.time_report
5224 if(coord==obj_report.coordAttacker){//get troops attack
5225 troopsAway=[]
5226 for(let i=0;i<obj_report.attackingArmy.length;i++){
5227 troopsAway.push({
5228 type:obj_report.attackingArmy[i].type,
5229 count:obj_report.attackingArmy[i].count - obj_report.attackingArmyLosses[i].count
5230 })
5231 }
5232 //type_village
5233 if(obj_report.typeAttacker.includes("off")){
5234 type_village="light"
5235 }
5236 else if(obj_report.typeAttacker=="spy"){
5237 type_village="spy"
5238 }
5239 else if(obj_report.typeAttacker.includes("def")){
5240 type_village="sword"
5241 }
5242
5243 }else if(coord==obj_report.coordDefender && obj_report.travelingTroops != undefined){//get troops away if it's defensive
5244 troopsAway=[]
5245 Object.keys(obj_report.travelingTroops).forEach(key=>{
5246 troopsAway.push({
5247 type:key,
5248 count:obj_report.travelingTroops[key]
5249 })
5250 })
5251 //type_village
5252 if(obj_report.typeDefender.includes("off")){
5253 type_village="light"
5254 }
5255 else if(obj_report.typeDefender=="spy"){
5256 type_village="spy"
5257 }
5258 else if(obj_report.typeDefender.includes("def")){
5259 type_village="sword"
5260 }
5261
5262 }
5263
5264 }
5265
5266
5267 //check for fang
5268 if(troops.axe + troops.light*4 < pop_small_attack && troops.catapult >= fangs_cat )
5269 fang=1
5270
5271 //check for nuke
5272 if(troops.axe + troops.light*4 + troops.ram*5 + troops.catapult*8 > pop_medium_attack)
5273 nuke=1
5274
5275 //check for noble
5276 if(troops.snob>0)
5277 noble=1
5278
5279 //check for fake
5280 let popFake=0
5281 Object.keys(troops).forEach(key=>{
5282 popFake+= troops[key] * troopsPop[key]
5283 })
5284 if(popFake<200)
5285 fake=1
5286
5287
5288
5289
5290 ////map for show info on the map
5291 if(!tribemates.includes(player_destination_name)){
5292
5293 if(date_landing>date_current){
5294 if(mapAttacksVillageId.has(villageId)){
5295 let obj_update=mapAttacksVillageId.get(villageId)
5296 obj_update.nr_nukes+=nuke
5297 obj_update.nr_nobles+=noble
5298 obj_update.nr_fangs+=fang
5299 mapAttacksVillageId.set(villageId,obj_update)
5300
5301 }
5302 else{
5303 mapAttacksVillageId.set(villageId,{
5304 villageId:villageId,
5305 player_destination_name:player_destination_name,
5306 player_destination_id:player_destination_id,
5307 troopsAtHome:troopsAtHome,
5308 time_report_home:time_report_home,
5309 troopsAway:troopsAway,
5310 time_report:time_report,
5311 type_village:type_village,
5312 nr_nukes:nuke,
5313 nr_nobles:noble,
5314 nr_fangs:fang,
5315 })
5316 }
5317 //map for selecting player
5318 if(type_attack.includes("attack"))
5319 mapAttacksPlayersId.set(player_destination_id,player_destination_name)
5320 }
5321
5322
5323 //map for show ranking attackers with fangs/nukes/fakes
5324 if(map_ranking_attacker.has(player_origin_id)){
5325 let obj_update=map_ranking_attacker.get(player_origin_id)
5326 obj_update.nr_nukes+=nuke
5327 obj_update.nr_nobles+=noble
5328 obj_update.nr_fangs+=fang
5329 obj_update.nr_fakes+=fake
5330 map_ranking_attacker.set(player_origin_id,obj_update)
5331 }
5332 else{
5333 map_ranking_attacker.set(player_origin_id,{
5334 player_origin_name:player_origin_name,
5335 nr_nukes:nuke,
5336 nr_nobles:noble,
5337 nr_fangs:fang,
5338 nr_fakes:fake
5339 })
5340 }
5341
5342 //map for show ranking defenders with fangs/nukes/fakes
5343 if(map_ranking_defender.has(player_destination_id)){
5344 let obj_update=map_ranking_defender.get(player_destination_id)
5345 obj_update.nr_nukes+=nuke
5346 obj_update.nr_nobles+=noble
5347 obj_update.nr_fangs+=fang
5348 obj_update.nr_fakes+=fake
5349 map_ranking_defender.set(player_destination_id,obj_update)
5350 }
5351 else{
5352 map_ranking_defender.set(player_destination_id,{
5353 player_origin_name:player_destination_name,
5354 nr_nukes:nuke,
5355 nr_nobles:noble,
5356 nr_fangs:fang,
5357 nr_fakes:fake
5358 })
5359 }
5360
5361
5362
5363 }
5364
5365
5366
5367 })
5368
5369
5370
5371
5372 console.log("mapVillageByIdFinal",mapVillageByIdFinal)
5373 console.log("mapAttacksVillageId",mapAttacksVillageId)
5374
5375 mapAttacksVillageId= new Map([...mapVillageByIdFinal, ...mapAttacksVillageId])
5376 console.log("mapAttacksVillageIdMerged",mapAttacksVillageId)
5377
5378 mapAttacksPlayersId= new Map([...mapAttacksPlayersIdFinal, ...mapAttacksPlayersId])
5379 console.log("mapAttacksPlayersIdMerged",mapAttacksPlayersId)
5380
5381
5382 //this part is just for testing
5383 // map_ranking_attacker.set("2101107",{
5384 // nr_fakes:45,
5385 // nr_fangs:21,
5386 // nr_nobles:5,
5387 // nr_nukes:15,
5388 // player_origin_name:"test1"
5389 // })
5390 // map_ranking_attacker.set("11580546",{
5391 // nr_fakes:67,
5392 // nr_fangs:43,
5393 // nr_nobles:7,
5394 // nr_nukes:11,
5395 // player_origin_name:"test2"
5396 // })
5397 // map_ranking_defender.set("9734279",{
5398 // nr_fakes:21,
5399 // nr_fangs:26,
5400 // nr_nobles:11,
5401 // nr_nukes:31,
5402 // player_origin_name:"test3"
5403 // })
5404
5405
5406 // map_ranking_defender.set("2101107",{
5407 // nr_fakes:11,
5408 // nr_fangs:22,
5409 // nr_nobles:33,
5410 // nr_nukes:44,
5411 // player_origin_name:"test4"
5412 // })
5413 // map_ranking_defender.set("11580546",{
5414 // nr_fakes:22,
5415 // nr_fangs:44,
5416 // nr_nobles:55,
5417 // nr_nukes:66,
5418 // player_origin_name:"test5"
5419 // })
5420 // map_ranking_defender.set("9734279",{
5421 // nr_fakes:21,
5422 // nr_fangs:31,
5423 // nr_nobles:41,
5424 // nr_nukes:51,
5425 // player_origin_name:"test6"
5426 // })
5427
5428 // map_status.set("123",{
5429 // report_date:"05/20/2021 15:30:10",
5430 // incoming_date:"05/20/2021 15:30:10",
5431 // command_date:"05/20/2021 15:30:10",
5432 // name:"test1"
5433 // })
5434 // map_status.set("2222",{
5435 // report_date:"05/22/2021 11:30:10",
5436 // incoming_date:"05/22/2021 11:30:10",
5437 // command_date:"05/22/2021 11:30:10",
5438 // name:"test2"
5439 // })
5440 // map_status.set("4124",{
5441 // report_date:"05/21/2021 14:30:10",
5442 // incoming_date:"05/21/2021 14:30:10",
5443 // command_date:"05/21/2021 14:30:10",
5444 // name:"test3"
5445 // })
5446
5447
5448
5449 console.log("map_ranking_attacker",map_ranking_attacker)
5450
5451
5452 //this part is for defensive info
5453 let mapVillageById=new Map()
5454 Array.from(map_playerId.keys()).forEach(key=>{
5455 let list_coords=map_playerId.get(key).list_coords
5456 for(let i=0;i<list_coords.length;i++){
5457 let list_coming=list_coords[i].list_coming
5458 let obj_result={}
5459 let pop=0
5460 let wallLevel=20
5461 //calc pop for support coming
5462 for(let j=0;j<list_coming.length;j++){
5463 if(list_coming[j].type_attack.includes("support")){
5464
5465 pop+=list_coming[j].troops["spear"]*troopsPop["spear"]
5466 pop+=list_coming[j].troops["sword"]*troopsPop["sword"]
5467 pop+=list_coming[j].troops["heavy"]*troopsPop["heavy"]
5468 if(game_data.units.includes("archer"))
5469 pop+=list_coming[j].troops["archer"]*troopsPop["archer"]
5470 }
5471 else if(list_coming[j].type_attack.includes("attack_small.png")){
5472 list_coords[i].nr_attacks = list_coords[i].nr_attacks-1
5473 }
5474 }
5475 //calc pop for troops home
5476
5477 if(list_coords[i].homeInfo!=undefined){
5478 let troops_home=list_coords[i].homeInfo.obj_troops
5479 wallLevel=list_coords[i].homeInfo.wallLevel
5480
5481 pop+=troops_home["spear"]*troopsPop["spear"]
5482 pop+=troops_home["sword"]*troopsPop["sword"]
5483 pop+=troops_home["heavy"]*troopsPop["heavy"]
5484 if(game_data.units.includes("archer"))
5485 pop+=troops_home["archer"]*troopsPop["archer"]
5486
5487 }
5488 pop=parseInt(pop/1000)
5489
5490 obj_result.villageId=list_coords[i].coord_destination_id
5491 obj_result.playerId=key
5492
5493 obj_result.nr_attacks=list_coords[i].nr_attacks
5494 obj_result.nr_nobles=list_coords[i].nr_nobles
5495
5496 obj_result.nr_snipe=list_coords[i].nr_snipe
5497 obj_result.nr_sniped=list_coords[i].nr_sniped
5498
5499 obj_result.nr_recap=list_coords[i].nr_recap
5500 obj_result.nr_recaped=list_coords[i].nr_recaped
5501
5502 obj_result.pop=pop
5503 obj_result.wallLevel=wallLevel
5504
5505 mapVillageById.set(list_coords[i].coord_destination_id,obj_result)
5506 }
5507 })
5508
5509
5510 //event for radio button
5511 $("input[name='type_info']").on("click",()=>{
5512 console.log("load radio")
5513 let radio_select=$("input[name='type_info']:checked").val()
5514 //clear options and add 'all' option
5515 $("#select_player").find("option").remove()
5516 $('#select_player').append($('<option>', {
5517 value: "all",
5518 text: "all"
5519 }));
5520
5521 if(radio_select=="defensive_info"){
5522 Array.from(map_playerId.keys()).forEach(key=>{
5523 $('#select_player').append($('<option>', {
5524 value: key,
5525 text: map_playerId.get(key).player_destination_name
5526 }));
5527 })
5528 }
5529 else if(radio_select=="offensive_info"){//offensive info
5530 Array.from(mapAttacksPlayersId.keys()).forEach(key=>{
5531 $('#select_player').append($('<option>', {
5532 value: key,
5533 text: mapAttacksPlayersId.get(key)
5534 }));
5535 })
5536 }
5537
5538 })
5539 $("input[name='type_info']:checked").click()
5540
5541
5542
5543 //btn show info on the map
5544 document.getElementById("btn_show_info").addEventListener("click",()=>{
5545
5546 let radio_select=$("input[name='type_info']:checked").val()
5547
5548 //filter information
5549
5550 if(radio_select=="offensive_info" ){
5551 console.log("mapAttacksVillageId",mapAttacksVillageId)
5552 let drawInfo=true
5553 let originalSpawnSector = TWMap.mapHandler.spawnSector;
5554
5555 TWMap.mapHandler.spawnSector = function (data, sector) {
5556 originalSpawnSector.call(TWMap.mapHandler, data, sector);
5557 let value_option=document.getElementById("select_player").value
5558 console.log(`call`,value_option)
5559 let radio_select_inside=$("input[name='type_info']:checked").val()
5560
5561 if(drawInfo==true && radio_select_inside=="offensive_info"){
5562 drawInfo=false
5563 window.setTimeout(() => {
5564
5565 let visibleSectors=TWMap.map._visibleSectors
5566 Object.keys(visibleSectors).forEach(key=>{
5567 let elements=visibleSectors[key]._elements
5568 Object.keys(elements).forEach(key=>{
5569 let villageId=elements[key].id.match(/\d+/)
5570 // console.log(villageId)
5571 if(villageId!=null){
5572 if(mapAttacksVillageId.has(villageId[0])){
5573
5574 if(value_option=="all"){
5575 let obj=mapAttacksVillageId.get(villageId[0])
5576 createMapInfoOffensiveSmall(obj)
5577 console.log("draw offensive for every player")
5578 }
5579 else{
5580 let obj=mapAttacksVillageId.get(villageId[0])
5581 if(obj.player_destination_id==value_option){
5582 createMapInfoOffensiveSmall(obj)
5583 console.log("draw offensive only for 1 player")
5584
5585 }
5586 }
5587 }
5588 }
5589 })
5590 })
5591 drawInfo=true
5592 }, 200);
5593 }
5594 };
5595
5596 showPopupInfo(mapAttacksVillageId)
5597
5598 }
5599 else if(radio_select=="defensive_info"){
5600
5601 console.log("mapVillageById",mapVillageById)
5602 let drawInfo=true
5603 let originalSpawnSector = TWMap.mapHandler.spawnSector;
5604
5605 TWMap.mapHandler.spawnSector = function (data, sector) {
5606 originalSpawnSector.call(TWMap.mapHandler, data, sector);
5607 let value_option=document.getElementById("select_player").value
5608 console.log(`call`,value_option)
5609 let radio_select_inside=$("input[name='type_info']:checked").val()
5610
5611 if(drawInfo==true && radio_select_inside=="defensive_info"){
5612 drawInfo=false
5613 window.setTimeout(() => {
5614
5615 let visibleSectors=TWMap.map._visibleSectors
5616 Object.keys(visibleSectors).forEach(key=>{
5617 let elements=visibleSectors[key]._elements
5618 Object.keys(elements).forEach(key=>{
5619 let villageId=elements[key].id.match(/\d+/)
5620 // console.log(villageId)
5621 if(villageId!=null){
5622 if(mapVillageById.has(villageId[0])){
5623
5624 if(value_option=="all"){
5625 let obj=mapVillageById.get(villageId[0])
5626 createMapInfoDefensiveSmall(obj)
5627 console.log("draw defensive for every player")
5628 }
5629 else{
5630 let obj=mapVillageById.get(villageId[0])
5631 if(obj.playerId==value_option){
5632 createMapInfoDefensiveSmall(obj)
5633 console.log("draw defensive only for 1 player")
5634
5635 }
5636 }
5637 }
5638 }
5639 })
5640 })
5641
5642 drawInfo=true
5643 }, 200);
5644 }
5645 };
5646 }
5647
5648 })
5649
5650
5651 //sort by fakes map ranking
5652 map_ranking_attacker = new Map([...map_ranking_attacker.entries()].sort((o1,o2)=>{
5653 return (o1[1].nr_fakes>o2[1].nr_fakes)?-1:(o1[1].nr_fakes<o2[1].nr_fakes)?1:0
5654 }))
5655 map_ranking_defender = new Map([...map_ranking_defender.entries()].sort((o1,o2)=>{
5656 return (o1[1].nr_fakes>o2[1].nr_fakes)?-1:(o1[1].nr_fakes<o2[1].nr_fakes)?1:0
5657 }))
5658
5659
5660 //create tabels and add event btn for each tabel
5661 createTableRankingAttackers(map_ranking_attacker)
5662 createTableRankingDefenders(map_ranking_defender)
5663 createTableUploadTime(map_status)
5664
5665 document.getElementById("btn_rank_attacker").addEventListener("click",()=>{
5666 createTableRankingAttackers(map_ranking_attacker)
5667 })
5668 document.getElementById("btn_rank_defender").addEventListener("click",()=>{
5669 createTableRankingDefenders(map_ranking_defender)
5670 })
5671 document.getElementById("btn_upload_time").addEventListener("click",()=>{
5672 createTableUploadTime(map_status)
5673 })
5674
5675
5676}
5677
5678
5679function createMapInfoDefensiveSmall(obj){
5680
5681 try {
5682 if(document.getElementById(`info_extra${obj.villageId}`)==null && obj.nr_attacks>0){
5683 let greenColor="#026440"//green
5684 let redColor="#E80000"//red
5685 let blueLightColor ="#157de5";//blueLightColor
5686 let purpleColor="#a06a34"
5687 let villageImg=document.getElementById(`map_village_${obj.villageId}`)
5688
5689 let parent=document.getElementById(`map_village_${obj.villageId}`).parentElement
5690 let leftImg=villageImg.style.left
5691 let topImg=villageImg.style.top
5692
5693 let colorBorder="background-color:rgba(20, 20, 20, 0.34)"//no border
5694
5695 if(obj.nr_snipe==1)
5696 colorBorder=`background-color:rgba(255, 10, 10, 0.14);outline:rgba(255, 51, 0, 0.7) solid 1px`// red border
5697
5698 if(obj.nr_recap==1)
5699 colorBorder=`background-color:rgba(0, 10, 255, 0.14);outline:rgba(0, 10, 255, 0.7) solid 1px`// blue border
5700
5701 if(obj.nr_sniped==1 || obj.nr_recaped==1)
5702 colorBorder=`background-color:rgba(155, 252, 10, 0.14);outline:rgba(51, 255, 0, 0.7) solid 1px`// green border
5703
5704
5705
5706 while(document.getElementById(`map_icons_${obj.villageId}`)!=null){
5707 document.getElementById(`map_icons_${obj.villageId}`).remove()
5708 }
5709 if(document.getElementById(`map_cmdicons_${obj.villageId}_0`)!=null)
5710 document.getElementById(`map_cmdicons_${obj.villageId}_0`).remove()
5711 if(document.getElementById(`map_cmdicons_${obj.villageId}_1`)!=null)
5712 document.getElementById(`map_cmdicons_${obj.villageId}_1`).remove()
5713
5714 let html_info=`
5715 <img style="position:absolute;left:${leftImg};top:${topImg};width:14px;height:14px;z-index:4;margin-left:7px;" src="https://dsen.innogamescdn.com/asset/c2dee33a/graphic//map/incoming_attack.png">
5716 <center><font color="${greenColor}" class="shadow20" style="position:absolute;left:${leftImg};top:${topImg};width:14px;height:14px;z-index:4;margin-left:18px; font-size: 12px">${obj.nr_attacks}</font></center>
5717 <center><font color="${blueLightColor}" class="shadow20" style="position:absolute;left:${leftImg};top:${topImg};width:35px;height:15px;z-index:4;margin-top:22px;font-size: 12px">${obj.pop}k</font></center>
5718 <div id="info_extra${obj.villageId}" style="position:absolute;left:${leftImg};top:${topImg};width:51px;height:36px;z-index:3; ${colorBorder}">
5719 </div>
5720 `
5721 if(obj.nr_nobles>0){
5722 html_info+=`
5723 <center><font color="${redColor}" class="shadow20" style="position:absolute;left:${leftImg};top:${topImg};width:14px;height:14px;z-index:4;margin-left:34px; font-size: 12px">${obj.nr_nobles}</font></center>`
5724 }
5725 if(obj.wallLevel<20){
5726 html_info+=`
5727 <center><font color="${purpleColor}" class="shadow20" style="position:absolute;left:${leftImg};top:${topImg};width:14px;height:14px;z-index:4;margin-top:22px;margin-left:34px;font-size: 12px;">${obj.wallLevel}</font></center>`
5728 }
5729 $(html_info).appendTo(parent);
5730 }
5731
5732 } catch (error) {
5733
5734 }
5735}
5736
5737function createMapInfoOffensiveSmall(obj){
5738
5739 try {
5740 if(document.getElementById(`info_extra${obj.villageId}`) == null ){
5741 let greenColor="#026440"//green
5742 let redColor="#E80000"//red
5743 let blueLightColor ="#157de5";//blueLightColor
5744 let brownColor="#a06a34"
5745 let villageImg=document.getElementById(`map_village_${obj.villageId}`)
5746
5747 let parent=document.getElementById(`map_village_${obj.villageId}`).parentElement
5748 let leftImg=villageImg.style.left
5749 let topImg=villageImg.style.top
5750
5751 let greenBorder=`background-color:rgba(155, 252, 10, 0.14);outline:rgba(51, 255, 0, 0.7) solid 1px`//green
5752 var redBorder=`background-color:rgba(255, 10, 10, 0.14);outline:rgba(255, 51, 0, 0.7) solid 1px`//red
5753 var noBorder=`background-color:rgba(40, 40, 40, 0.34)`
5754
5755 while(document.getElementById(`map_icons_${obj.villageId}`)!=null){
5756 document.getElementById(`map_icons_${obj.villageId}`).remove()
5757 }
5758 if(document.getElementById(`map_cmdicons_${obj.villageId}_0`)!=null)
5759 document.getElementById(`map_cmdicons_${obj.villageId}_0`).remove()
5760 if(document.getElementById(`map_cmdicons_${obj.villageId}_1`)!=null)
5761 document.getElementById(`map_cmdicons_${obj.villageId}_1`).remove()
5762
5763 let colorTypeAttack=""
5764 if(obj.type_village!=null){
5765 if(obj.type_village=="sword")
5766 colorTypeAttack="background-color:rgb(0,255,255)"
5767 else if(obj.type_village=="light")
5768 colorTypeAttack="background-color:rgb(255,255,0)"
5769 else if(obj.type_village=="spy")
5770 colorTypeAttack="background-color:rgb(255,255,255)"
5771
5772 }
5773
5774
5775 let html_info
5776 //info for small img village on the map
5777 if(obj.nr_nukes>0 || obj.nr_nobles>0 || obj.nr_fangs >0 ){
5778 html_info=`
5779 <div id="info_extra${obj.villageId}" style="position:absolute;left:${leftImg};top:${topImg};width:51px;height:36px;z-index:3; ${greenBorder}"></div>`
5780
5781 if(obj.nr_fangs>0){
5782 html_info+=`
5783 <center><font color="${brownColor}" class="shadow20" style="position:absolute;left:${leftImg};top:${topImg};width:14px;height:14px;z-index:4;margin-top:22px;margin-left:0px;font-size: 12px;">${obj.nr_fangs}</font></center>`
5784 }
5785 if(obj.nr_nukes>0){
5786 html_info+=`
5787 <center><font color="${greenColor}" class="shadow20" style="position:absolute;left:${leftImg};top:${topImg};width:14px;height:14px;z-index:4;margin-top:22px;margin-left:17px;font-size: 12px;">${obj.nr_nukes}</font></center>`
5788 }
5789 if(obj.nr_nobles>0){
5790 html_info+=`
5791 <center><font color="${redColor}" class="shadow20" style="position:absolute;left:${leftImg};top:${topImg};width:14px;height:14px;z-index:4;margin-top:22px;margin-left:34px;font-size: 12px;">${obj.nr_nobles}</font></center>`
5792 }
5793 if(obj.type_village!=null){
5794 html_info+=`<img style="position:absolute;left:${leftImg};top:${topImg};width:16px;height:16px;z-index:4;margin-left:35px;${colorTypeAttack}" src="https://dsen.innogamescdn.com/asset/c2dee33a/graphic/unit/unit_${obj.type_village}.png">`
5795 }
5796
5797
5798 }
5799 else{
5800 html_info=`
5801 <div id="info_extra${obj.villageId}" style="position:absolute;left:${leftImg};top:${topImg};width:51px;height:36px;z-index:3; ${redBorder}"></div>`
5802
5803 if(obj.type_village!=null){
5804 html_info+=`<img style="position:absolute;left:${leftImg};top:${topImg};width:16px;height:16px;z-index:4;margin-left:35px;${colorTypeAttack}" src="https://dsen.innogamescdn.com/asset/c2dee33a/graphic/unit/unit_${obj.type_village}.png">`
5805 }
5806 }
5807 $(html_info).appendTo(parent);
5808
5809
5810 //info for the popup window for each village
5811 }
5812
5813 } catch (error) {
5814
5815 }
5816}
5817
5818function showPopupInfo(mapAttacksVillageId){
5819 let originalDisplayForVillage = TWMap.popup.displayForVillage;
5820
5821 TWMap.popup.displayForVillage = function (e, a, t) {
5822 console.log('intercepted displayForVillage');
5823 originalDisplayForVillage.call(TWMap.popup, e, a, t);
5824 let villageInfo = e;
5825 console.log(villageInfo)
5826
5827 let obj=mapAttacksVillageId.get(villageInfo.id)
5828
5829
5830
5831 let units=game_data.units
5832 //first row
5833 let militia=0
5834 let drawPopup=false
5835 if(units.includes("militia"))
5836 militia=1
5837
5838 let html_popup=`
5839 <table class="vis popup_info_extra" border="1" style="width: 100%;border-collapse: collapse">
5840 <tr>
5841 <td style="text-align:center; width:auto;background-color:#c1a264" >
5842 <center style="margin:0px;"></center>
5843 </td>
5844 <td style="text-align:center; width:auto;background-color:#c1a264" >
5845 <center style="margin:0px;"><b>seen</b></center>
5846 </td>`
5847
5848
5849 for(let i=0;i<units.length-militia;i++){
5850 html_popup+=`
5851 <td style="text-align:center; width:auto;background-color:#c1a264" >
5852 <center style="margin-top:0px;"><img src="https://dsen.innogamescdn.com/asset/c2dee33a/graphic/unit/unit_${units[i]}.png"></center>
5853 </td>`
5854 }
5855 html_popup+="</tr>"
5856
5857
5858 if(obj!=undefined){
5859 if(obj.troopsAtHome!=null ){
5860 drawPopup=true
5861 html_popup+=`
5862 <tr>
5863 <td style="text-align:center; width:auto;" >
5864 <center style="margin:0px;"><b>at home</b></center>
5865 </td>
5866 <td style="text-align:center; width:auto;" >
5867 <center style="margin:0px;"><b>${obj.time_report_home}</b></center>
5868 </td>
5869 `
5870
5871 for(let i=0;i<obj.troopsAtHome.length-militia;i++){
5872 html_popup+=`
5873 <td style="text-align:center; width:auto;" >
5874 <center style="margin:0px;">${obj.troopsAtHome[i].count}</center>
5875 </td>`
5876 }
5877 html_popup+=`</tr>`
5878 }
5879 }
5880
5881 if(obj!=undefined){
5882 if(obj.troopsAway!=null){
5883 drawPopup=true
5884 html_popup+=`
5885 <tr>
5886 <td style="text-align:center; width:auto;" >
5887 <center style="margin:0px;"><b>away</b></center>
5888 </td>
5889 <td style="text-align:center; width:auto;" >
5890 <center style="margin:0px;"><b>${obj.time_report}</b></center>
5891 </td>`
5892
5893 for(let i=0;i<obj.troopsAway.length;i++){
5894 html_popup+=`
5895 <td style="text-align:center; width:auto;" >
5896 <center style="margin:0px;">${obj.troopsAway[i].count}</center>
5897 </td>`
5898 }
5899 html_popup+=`</tr>`
5900 }
5901 }
5902
5903 html_popup+=`</table>`
5904
5905 if(drawPopup==true){
5906 $(".popup_info_extra").remove()
5907 $('#map_popup').append(html_popup)
5908
5909 }
5910
5911
5912 }
5913
5914
5915}
5916
5917
5918 ////////////////////////////////////////////////////////////////// create table for players/////////////////////////////////////////////////////
5919
5920function createTablePlayers(map_playerId,mapVillage){
5921 let html_tr_player="<tbody id='tbody_player'>"
5922 let counterPlayer=0;
5923 let nr_attacks_total=0,nr_supports_total=0,nr_nobles_total=0;
5924 let nr_snipe_total=0,nr_sniped_total=0,nr_recap_total=0,nr_recaped_total=0;
5925 Array.from(map_playerId.keys()).forEach(key=>{
5926 let obj=map_playerId.get(key)
5927 counterPlayer++;
5928 nr_attacks_total +=obj.nr_attacks_total
5929 nr_supports_total+=obj.nr_supports_total
5930 nr_nobles_total +=obj.nr_nobles_total
5931 nr_snipe_total +=obj.nr_snipe_total
5932 nr_sniped_total +=obj.nr_sniped_total
5933 nr_recap_total +=obj.nr_recap_total
5934 nr_recaped_total +=obj.nr_recaped_total
5935
5936 html_tr_player+=
5937 `<tr>
5938
5939 <td style="text-align:center; width:40px; background-color:${headerColor}">
5940 <a href="#" ><center style="margin:5px"><font color="${titleColor}"><img player-id="${key}" number-tr="${counterPlayer}"class="infoPlayer" src="https://img.icons8.com/clouds/30/000000/more.png"/></font></center></a>
5941 </td>
5942 <td style="text-align:center; width:auto; background-color:${headerColor}">
5943 <a href="${game_data.link_base_pure}info_player&id=${key}"><center style="margin:5px"><font color="${titleColor}">${obj.player_destination_name}</font></center></a>
5944 </td>
5945 <td style="text-align:center; width:auto; background-color:${headerColor}">
5946 <center style="margin:5px;font-size:16px"><font color="${titleColor}"><img src="https://dsen.innogamescdn.com/asset/4ba99e83/graphic/unit/att.png">(${obj.nr_attacks_total})</font></center>
5947 </td>
5948 <td style="text-align:center; width:auto; background-color:${headerColor}">
5949 <center style="margin:5px;font-size:16px"><font color="${titleColor}"><img src="https://dsen.innogamescdn.com/asset/a9e85669/graphic/command/support.png">(${obj.nr_supports_total})</font></center>
5950 </td>
5951 <td style="text-align:center; width:auto; background-color:${headerColor}">
5952 <center style="margin:5px;font-size:16px"><font color="${titleColor}"><img src="https://dsen.innogamescdn.com/asset/a9e85669/graphic/command/snob.png">(${obj.nr_nobles_total})</font></center>
5953 </td>
5954 <td style="text-align:center; width:auto; background-color:${headerColor}">
5955 <center style="margin:5px;font-size:16px"><font color="${titleColor}"><img src="https://img.icons8.com/office/20/000000/sniper-rifle.png"/>(${obj.nr_sniped_total}/${obj.nr_snipe_total})</font></center>
5956 </td>
5957 <td style="text-align:center; width:auto; background-color:${headerColor}">
5958 <center style="margin:5px;font-size:16px"><font color="${titleColor}"><img src="https://img.icons8.com/ultraviolet/20/000000/horror.png"/>(${obj.nr_recaped_total}/${obj.nr_recap_total})</font></center>
5959 </td>
5960
5961 </tr>
5962 `
5963
5964 })
5965 html_tr_player+="</tbody>"
5966 if(document.getElementById("tbody_player")!=null)
5967 document.getElementById("tbody_player").remove()
5968 document.getElementById("table_view").innerHTML+=html_tr_player
5969 $("#table_view").hide()
5970 $("#table_view").toggle(500)
5971
5972 document.getElementById("header_attacks").innerText=`(${nr_attacks_total})`
5973 document.getElementById("header_supports").innerText=`(${nr_supports_total})`
5974 document.getElementById("header_nobles").innerText=`(${nr_nobles_total})`
5975 document.getElementById("header_snipes").innerText=`(${nr_sniped_total}/${nr_snipe_total})`
5976 document.getElementById("header_recaps").innerText=`(${nr_recaped_total}/${nr_recap_total})`
5977
5978 $(".infoPlayer").on("click",(event)=>{
5979 let playerId=event.target.getAttribute("player-id")
5980 let numberTr=event.target.getAttribute("number-tr")
5981 // console.log(event.target)
5982 let list_coords=map_playerId.get(playerId).list_coords
5983
5984 /////////// ///////////////////////////////////////////////////////////////////coords table//////////////////////////////////////////////////////////
5985 // red: '#ff8080',
5986 // green: '#4dff4d'
5987 let html_table_player=`
5988 <tr >
5989 <td >
5990 <div style="height:700px;overflow:auto;" id="div_incomingsInfo">
5991 <table class="table_player" border="1" style="width: 100%;background-color:${backgroundColor};border-color:${borderColor};border-spacing:2px;border-collapse:separate;">
5992 `
5993 let counterVillage=0;
5994 console.log("list_coord",list_coords)
5995 for(let i=0;i<list_coords.length;i++){
5996 let obj=list_coords[i]
5997 if(list_coords[i].nr_attacks>0 || list_coords[i].nr_supports>0){//show attacks and supports, i might delete supports
5998 counterVillage++
5999
6000 let headColorSnipe=(obj.nr_sniped==1)?"#4dff4d":(obj.nr_snipe==1)?"#ff8080":headerColor
6001 let headColorRecap=(obj.nr_recaped==1)?"#4dff4d":(obj.nr_recap==1)?"#ff8080":headerColor
6002
6003 html_table_player+=`
6004 <tr>
6005 <td style="text-align:center; width:40px; background-color:${headerColorPlayers}">
6006 <a href="#" style="margin:0px" ><center ><font color="${titleColor}"><img coord-id="${obj.coord_destination_id}" number-tr-coord="${counterVillage}" class="infoCoord" src="https://img.icons8.com/bubbles/20/000000/more.png"/></font></center></a>
6007 </td>
6008 <td style="text-align:center; width:auto; background-color:${headerColorPlayers}">
6009 <a href="${game_data.link_base_pure}info_village&id=${obj.coord_destination_id}" style="margin:0px"><center><font color="${titleColor}">${obj.list_coming[0].coord_destination}</font></center></a>
6010 </td>
6011 <td style="text-align:center; width:auto; background-color:${headerColorPlayers}">
6012 <center style="margin:0px;font-size:16px"><font color="${titleColor}"><img src="https://dsen.innogamescdn.com/asset/4ba99e83/graphic/unit/att.png">(${obj.nr_attacks})</font></center>
6013 </td>
6014 <td style="text-align:center; width:auto; background-color:${headerColorPlayers}">
6015 <center style="margin:2px;font-size:16px"><font color="${titleColor}"><img src="https://dsen.innogamescdn.com/asset/a9e85669/graphic/command/support.png">(${obj.nr_supports})</font></center>
6016 </td>
6017 <td style="text-align:center; width:auto; background-color:${headerColorPlayers}">
6018 <center style="margin:2px;font-size:16px"><font color="${titleColor}"><img src="https://dsen.innogamescdn.com/asset/a9e85669/graphic/command/snob.png">(${obj.nr_nobles})</font></center>
6019 </td>
6020 <td style="text-align:center; width:auto; background-color:${headColorSnipe}">
6021 <center style="margin:2px;font-size:16px"><font color="${titleColor}"><img src="https://img.icons8.com/office/20/000000/sniper-rifle.png"/></font></center>
6022 </td>
6023 <td style="text-align:center; width:auto; background-color:${headColorRecap}">
6024 <center style="margin:2px;font-size:16px"><font color="${titleColor}"><img src="https://img.icons8.com/ultraviolet/20/000000/horror.png"/></font></center>
6025 </td>
6026 </tr>
6027 `
6028 }
6029 }
6030
6031
6032
6033 html_table_player+=`
6034 </div>
6035 </table>
6036 <td>
6037 </tr>
6038 `
6039 let delay=500
6040 // console.log(document.getElementById(`table_player${numberTr}`))
6041 if(document.getElementById(`table_player${numberTr}`)!=null){
6042 $(".tr_table_coord").hide(delay)
6043 window.setTimeout(()=>{
6044 $(".tr_table_coord").remove()
6045 },delay+10)
6046
6047 }
6048 else{
6049
6050 $(".tr_table_coord").remove()
6051 // console.log(html_table_player)
6052 var table_support = document.getElementById("table_view").getElementsByTagName("tbody")[0]
6053 var newRow = table_support.insertRow(numberTr);
6054 newRow.className="tr_table_coord"
6055 newRow.id=`table_player${numberTr}`
6056
6057 let cell = newRow.insertCell();
6058 cell.setAttribute("colspan",7)
6059 var div = document.createElement("div")
6060 div.innerHTML=html_table_player
6061 $(cell).append(div)
6062 $(cell).hide()
6063 $(cell).show(delay)
6064
6065 createEventCoord(map_playerId,mapVillage,playerId)
6066
6067 }
6068 })
6069 sortInfoIncomings(map_playerId,mapVillage)
6070
6071}
6072
6073////////////////////////////////////////////////////////////////// create table with troops and info for each coord////////////////////////////////
6074
6075function createTableCoordTroops(obj,admin){
6076 let units=game_data.units
6077 let troopsSupportComing={}
6078 for(let i=0;i<units.length-1;i++){
6079 troopsSupportComing[units[i]]=0
6080 }
6081 // console.log(troopsSupportComing)
6082 for(let i=0;i<obj.list_coming.length;i++){
6083 if(obj.list_coming[i].type_attack.includes("support")){
6084 Object.keys(troopsSupportComing).forEach(key=>{
6085 troopsSupportComing[key]+=obj.list_coming[i].troops[key]
6086 })
6087 }
6088
6089 }
6090 troopsSupportComing.snob=0;
6091
6092 let html_table_coord=""
6093 ///////////////////////////////////////////////////////////////////info coord table//////////////////////////////////////////////////////////
6094 if(admin==true){
6095 html_table_coord+=`
6096 <tbody>
6097 <tr>
6098
6099 <td style="text-align:center; width:auto; background-color:${headerColorFirstRow}">
6100 <center style="margin:5px"><font color="${titleColor}">coord </font></center>
6101 </td>
6102 <td style="text-align:center; width:auto; background-color:${headerColorFirstRow}">
6103 <center style="margin:5px;padding;"><font color="${titleColor}"><img src="https://dsen.innogamescdn.com/asset/4ba99e83/graphic/unit/att.png"> </font></center>
6104 </td>
6105 <td style="text-align:center; width:auto; background-color:${headerColorFirstRow}">
6106 <center style="margin:5px"><font color="${titleColor}"><img src="https://dsen.innogamescdn.com/asset/4ba99e83/graphic/flags/small/3.png"> </font></center>
6107 </td>
6108 <td style="text-align:center; width:auto; background-color:${headerColorFirstRow}">
6109 <center style="margin:5px"><font color="${titleColor}"><img src="https://dsen.innogamescdn.com/asset/1d2499b/graphic/buildings/snob.png"> </font></center>
6110 </td>
6111 <td style="text-align:center; width:auto; background-color:${headerColorFirstRow}">
6112 <center style="margin:5x"><font color="${titleColor}"><img src="https://dsen.innogamescdn.com/asset/1d2499b/graphic/buildings/wall.png"> </font></center>
6113 </td>
6114 <td style="text-align:center; width:auto; background-color:${headerColorFirstRow}">
6115 <center style="margin:5px"><font color="${titleColor}"><img src="https://dsen.innogamescdn.com/asset/1d2499b/graphic/buildings/farm.png"> </font></center>
6116 </td>
6117 <td style="text-align:center; width:auto; background-color:${headerColorFirstRow}">
6118 <center style="margin:5px"><font color="${titleColor}">troops </font></center></p>
6119 </td>
6120
6121 `;
6122 /////////////////////////////////////////////////////////////////////////////Add info village//////////////////////////////////////////////////
6123
6124 for(let i=0;i<units.length-1;i++){
6125 html_table_coord+=`<td class="fm_unit" style="width:30px;text-align:center;width:auto; background-color:${headerColorFirstRow}"><img src="https://dsen.innogamescdn.com/asset/1d2499b/graphic/unit/unit_${units[i]}.png"></td>`
6126 }
6127 html_table_coord+=`
6128 <td style="text-align:center; width:auto; background-color:${headerColorFirstRow}">
6129 <center style="margin:1px"><font color="${titleColor}">pop</font></center>
6130 </td>`
6131 html_table_coord+=`</tr>
6132 <tr>`
6133
6134 html_table_coord+=`
6135 <td rowspan="3" class="" style="width:30px;height:30px;text-align:center; background-color:${headerColorCoords};color:white">${obj.list_coming[0].coord_destination}</td>
6136 <td rowspan="3" class="" style="width:70px;height:30px;text-align:center; background-color:${headerColorCoords};color:white">${obj.nr_attacks}</td>
6137 <td rowspan="3" class="" style="width:70px;height:30px;text-align:center; background-color:${headerColorCoords};color:white">${obj.homeInfo.flagName}</td>
6138 <td rowspan="3" class="" style="width:30px;height:30px;text-align:center; background-color:${headerColorCoords};color:white">${obj.homeInfo.LoyaltyLevel}</td>
6139 <td rowspan="3" class="" style="width:30px;height:30px;text-align:center; background-color:${headerColorCoords};color:white">${obj.homeInfo.wallLevel}</td>
6140 <td rowspan="3" class="" style="width:30px;height:30px;text-align:center; background-color:${headerColorCoords};color:white">${obj.homeInfo.farmLevel}</td>
6141 <td style="text-align:center; width:auto; background-color:${headerColorCoords}">
6142 <center style="margin:1px"><font color="${titleColor}">home</font></center>
6143 </td>
6144 `
6145 /////////////////////////////////////////////////////////////////////////////////////////home troops//////////////////////////////////////////////////
6146 let total_pop=0;
6147 for(let i=0;i<units.length-1;i++){
6148 let value_troop=obj.homeInfo.obj_troops[units[i]]
6149 let name_troop=units[i]
6150 if(name_troop!="spy" && name_troop!="light" && name_troop!="marcher" && name_troop!="ram"&& name_troop!="catapult" && name_troop!="axe"){
6151 total_pop+=value_troop*troopsPop[name_troop]
6152 }
6153 html_table_coord+=`<td style="width:30px;height:30px;text-align:center; background-color:${headerColorCoords};color:white">`+value_troop+"</td>"
6154 }
6155 html_table_coord+=`<td style="width:60px;height:30px;text-align:center; background-color:${headerColorCoords};color:white">`+total_pop+"</td>"
6156 html_table_coord+=`</tr>
6157 <tr>
6158 <td style="text-align:center; width:auto; background-color:${headerColorCoords}">
6159 <center style="margin:1px"><font color="${titleColor}">coming</font></center>
6160 </td>`
6161
6162 ////////////////////////////////////////////////////////////////////////////////////////coming troops//////////////////////////////////////////////////
6163 total_pop=0;
6164 for(let i=0;i<units.length-1;i++){
6165 let value_troop_coming=troopsSupportComing[units[i]]
6166 let name_troop=units[i]
6167 if(name_troop!="spy" && name_troop!="light" && name_troop!="marcher" && name_troop!="ram"&& name_troop!="catapult" && name_troop!="axe"){
6168 total_pop+=value_troop_coming*troopsPop[name_troop]
6169 }
6170 html_table_coord+=`<td style="width:30px;height:30px;text-align:center; background-color:${headerColorCoords};color:white">`+value_troop_coming+"</td>"
6171 }
6172 html_table_coord+=`<td style="width:60px;height:30px;text-align:center; background-color:${headerColorCoords};color:white">`+total_pop+"</td>"
6173
6174 html_table_coord+=`</tr>
6175 <tr>
6176 <td style="text-align:center; width:auto; background-color:${headerColorCoords}">
6177 <center style="margin:1px"><font color="${titleColor}">total </font></center>
6178 </td>`
6179 ////////////////////////////////////////////////////////////////////////////////////////total troops//////////////////////////////////////////////////
6180 total_pop=0;
6181 for(let i=0;i<units.length-1;i++){
6182 let value_troop=troopsSupportComing[units[i]]+obj.homeInfo.obj_troops[units[i]]
6183 let name_troop=units[i]
6184 if(name_troop!="spy" && name_troop!="light" && name_troop!="marcher" && name_troop!="ram"&& name_troop!="catapult" && name_troop!="axe"){
6185 total_pop+=value_troop*troopsPop[name_troop]
6186 }
6187 html_table_coord+=`<td style="width:30px;height:30px;text-align:center; background-color:${headerColorCoords};color:white">`+value_troop+"</td>"
6188 }
6189 html_table_coord+=`<td style="width:60px;height:30px;text-align:center; background-color:${headerColorCoords};color:white">`+total_pop+"</td>"
6190 html_table_coord+="</tr></tbody>"
6191 return html_table_coord
6192 }
6193}
6194
6195//////////////////////////////////////////add click event for coord and when it's pressed show table with troops and incomings////////////////////
6196
6197function createEventCoord(map_playerId,mapVillage,playerId){
6198 $(".infoCoord").on("click",(event)=>{
6199
6200 // console.log(this.parentElement)
6201 // console.log($(this).parent())
6202
6203 // console.log("event infoCoord")
6204 let coordId=event.target.getAttribute("coord-id")
6205 let numberTrCoord=event.target.getAttribute("number-tr-coord")
6206 let obj={}
6207 let list_coords=map_playerId.get(playerId).list_coords
6208 // console.log(playerId)
6209 // console.log(list_coords)
6210 for(let i=0;i<list_coords.length;i++){
6211 if(coordId==list_coords[i].coord_destination_id){
6212 obj=list_coords[i]
6213 break;
6214 }
6215 }
6216 console.log("obj",obj)
6217 console.log("mapVillage",mapVillage)
6218
6219 // console.log(obj)
6220 // console.log(coordId)
6221 // console.log(numberTrCoord)
6222 // console.log(event.target)
6223
6224 console.log("objbaaa",obj)
6225 let admin=true
6226 let html_table_coord=`<tr><td >`
6227 if(obj.hasOwnProperty("homeInfo")==true){
6228 html_table_coord=`<table class="table_coord" border="1" coord-id="${coordId}" style="width: 100%;background-color:${backgroundColor};border-color:${borderColor};border-spacing:2px;border-collapse:separate;"> `
6229 html_table_coord+=createTableCoordTroops(obj,admin)
6230 html_table_coord+="</table>"
6231 }
6232
6233 html_table_coord+=`
6234 <div style="height:400px;overflow:auto;" id="div_incomingsInfo">
6235 <table class="table_coord" border="1" style="width: 100%;background-color:${backgroundColor};border-color:${borderColor};border-spacing:2px;border-collapse:separate;"></div> `
6236 html_table_coord+=createTableCoordIncomings(obj.list_coming,mapVillage)
6237
6238
6239
6240 html_table_coord+=`</table><td></tr>`
6241
6242
6243
6244
6245 let delay=500
6246 // console.log(document.getElementById(`table_coord${numberTrCoord}`))
6247 if(document.getElementById(`table_coord${numberTrCoord}`)!=null){
6248 $(".tr_table_coord_info").hide(delay)
6249 // $("#div_incomingsInfo").hide(delay)
6250 window.setTimeout(()=>{
6251 $(".tr_table_coord_info").remove()
6252 // $("#div_incomingsInfo").remove()
6253 },delay+10)
6254
6255 }
6256 else{
6257
6258 $(".tr_table_coord_info").remove()
6259 // console.log(html_table_player)
6260 var table_coord = document.getElementsByClassName("table_player")[0].getElementsByTagName("tbody")[0]
6261 var newRow = table_coord.insertRow(numberTrCoord);
6262 newRow.className="tr_table_coord_info"
6263 newRow.id=`table_coord${numberTrCoord}`
6264
6265 let cell = newRow.insertCell();
6266 cell.setAttribute("colspan",7)
6267 var div = document.createElement("div")
6268 div.innerHTML=html_table_coord
6269 $(cell).append(div)
6270 $(cell).hide()
6271 $(cell).show(delay)
6272 counterTime()
6273 }
6274
6275
6276 })
6277}
6278
6279////////////////////////////////////////////////////////////////// create table for incomings////////////////////////////////////////////////////////
6280
6281function createTableCoordIncomings(list,mapVillage){
6282 let serverTime=document.getElementById("serverTime").innerText
6283 let serverDate=document.getElementById("serverDate").innerText.split("/")
6284 serverDate=serverDate[1]+"/"+serverDate[0]+"/"+serverDate[2]
6285 let date_current=new Date(serverDate+" "+serverTime).getTime()
6286 // console.log("create table coord")
6287 console.log("createTableCoordIncomings")
6288 // console.log(list)
6289 // console.log(mapVillage)
6290 let html_incomings=`
6291 <tbody >
6292 <tr>
6293 <td style="text-align:center; width:auto; background-color:${headerColorFirstRow}">
6294 <center style="margin:5px"><font color="${titleColor}"><img src="https://dsen.innogamescdn.com/asset/056b9c0b/graphic/unit/att.png"> </font></center>
6295 </td>
6296 <td style="text-align:center; width:auto; background-color:${headerColorFirstRow}">
6297 <center style="margin:0px"><font color="${titleColor}">speed/pop </font></center>
6298 </td>
6299 <td colspan="2" style="text-align:center; width:auto; background-color:${headerColorFirstRow}">
6300 <center style="margin:0px"><font color="${titleColor}">destination </font></center>
6301 </td>
6302 <td colspan="2" style="text-align:center; width:auto; background-color:${headerColorFirstRow}">
6303 <center style="margin:0px"><font color="${titleColor}">origin </font></center>
6304 </td>
6305 <td style="text-align:center; width:auto; background-color:${headerColorFirstRow}">
6306 <center style="margin:0px"><font color="${titleColor}">Arrival time </font></center>
6307 </td>
6308 <td style="text-align:center; width:auto; background-color:${headerColorFirstRow}">
6309 <center style="margin:0px"><font color="${titleColor}">Arrives in </font></center>
6310 </td>
6311
6312
6313 </tr>`
6314
6315 for(let i=0;i<list.length;i++){
6316 // console.log("aici baa")
6317 // console.log(list[i])
6318 let labelName
6319 let villageId=mapVillage.get(list[i].coord_destination).villageId
6320 let playerId=mapVillage.get(list[i].coord_destination).playerId
6321 let playerName=mapVillage.get(list[i].coord_destination).playerName
6322 let headerNoble=headerColorCoords
6323 let titleColorNoble=titleColor
6324 let type_attack=list[i].type_attack
6325 console.log(type_attack)
6326 if(list[i].labelName=="none")
6327 labelName=`<img src="https://dsen.innogamescdn.com/asset/056b9c0b/graphic/delete.png">`
6328 else
6329 labelName=`<img src="https://dsen.innogamescdn.com/asset/a9e85669/graphic/unit/tiny/${list[i].labelName}">`
6330
6331 if(type_attack.includes("support")){
6332 let troops=list[i].troops
6333 let pop=0
6334 Object.keys(troops).forEach(key=>{
6335 pop+=troops[key]*troopsPop[key]
6336 })
6337 labelName=pop
6338 if(list[i].hasSupportSnipe==true){
6339 headerNoble="#034a2f"
6340 }
6341 type_attack=`https://dsen.innogamescdn.com/asset/a9e85669/graphic/command/${type_attack}`
6342
6343
6344 }else{
6345 //colore nobles
6346 if(labelName.includes("snob")){
6347 headerNoble="#3f0000"//red
6348 titleColorNoble="#4dff4d"//green
6349 }
6350 if(labelName.includes("snob") && tribemates.includes(list[i].player_origin_name)){
6351 headerNoble="#720000"//lighter red
6352 titleColorNoble="#4dff4d"//green
6353 }
6354
6355 //modify type_attack, small,medium,large
6356 if(type_attack=="def"){
6357 type_attack=`https://img.icons8.com/fluent/16/000000/d.png`
6358 }
6359 else{
6360 type_attack=`https://dsen.innogamescdn.com/asset/a9e85669/graphic/command/${type_attack}`
6361 }
6362
6363
6364 }
6365
6366 // console.log(list[i].labelName)
6367 let arrived=new Date(list[i].landing_time).getTime()
6368 if(arrived>date_current){
6369 let date=list[i].landing_time.split(" ")[0]
6370 let time=list[i].landing_time.split(" ")[1].split(":")
6371 let milisec=time.pop()
6372 time=time.join(":")
6373
6374 html_incomings+=`
6375 <tr style="white-space:nowrap;" >
6376 <td style="text-align:center; width:auto; background-color:${headerNoble}">
6377 <center style="margin:0px;padding:0px"><font color="${titleColor}"><img src="${type_attack}"> </font></center>
6378 </td>
6379 <td style="text-align:center; width:auto; background-color:${headerNoble}">
6380 <center style="margin:0px;padding:0px"><font color="${titleColor}">${labelName}</font></center>
6381 </td>
6382 <td style="text-align:center; width:auto; background-color:${headerNoble}">
6383 <a href="${game_data.link_base_pure}info_village&id=${villageId}"style="margin:0px;padding:0px"><center><font color="${titleColor}">${list[i].coord_destination}</font></center></a>
6384 </td>
6385 <td style="text-align:center; width:auto; background-color:${headerNoble}">
6386 <a href="${game_data.link_base_pure}info_player&id=${playerId}"style="margin:0px;padding:0px"><center><font color="${titleColor}">${playerName}</font></center></a>
6387 </td>
6388 <td style="text-align:center; width:auto; background-color:${headerNoble}">
6389 <a href="${game_data.link_base_pure}info_village&id=${list[i].coord_origin_id}"style="margin:0px;padding:0px"><center><font color="${titleColor}">${list[i].coord_origin}</font></center></a>
6390 </td>
6391 <td style="text-align:center; width:auto; background-color:${headerNoble}">
6392 <a href="${game_data.link_base_pure}info_player&id=${list[i].player_origin_id}" style="margin:0px;padding:0px"><center><font color="${titleColor}">${list[i].player_origin_name}</font></center></a>
6393 </td>
6394 <td style="text-align:center; width:auto; background-color:${headerNoble}">
6395 <center style="margin:0px;padding:0px"><font color="${titleColor}">${date} <b>${time} <font color="${titleColorNoble}"> ${milisec}</font></b> </font></center>
6396 </td>
6397 <td style="text-align:center; width:auto; background-color:${headerNoble}" >
6398 <center style="margin:0px;padding:0px"><font color="${titleColor}" date-time=${arrived} class="counterTime"></font></center>
6399 </td>
6400
6401 </tr>
6402 `
6403 }
6404 }
6405 html_incomings+="</tbody>"
6406 // console.log(html_incomings)
6407 return html_incomings
6408}
6409
6410
6411/////////////////////////////////////////////////////////////////create table for settings//////////////////////////////////////////////////////
6412function createTableSettings(){
6413 let html_table=`
6414 <center>
6415 <table id="table_settings" border="1" style="width: 40%;background-color:${backgroundColor};border-color:${borderColor};border-spacing:2px;border-collapse:separate;">
6416 <tr>
6417 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6418 <input type="checkbox" value="hide_ignored">
6419 </td>
6420 <td style="text-align:left; width:auto; background-color:${headerColor}" colspan="2">
6421 <font style="margin:5px" color="${titleColor}">hide ignored attacks/support</font>
6422 </td>
6423 </tr>
6424 <tr>
6425 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6426 <input type="checkbox" value="hide_supports">
6427 </td>
6428 <td style="text-align:left; width:auto; background-color:${headerColor}" colspan="2">
6429 <font style="margin:5px" color="${titleColor}">hide supports</font>
6430 </td>
6431 </tr>
6432 <tr>
6433 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6434 <input type="checkbox" value="hide_further_attacks">
6435 </td>
6436 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6437 <font style="margin:5px" color="${titleColor}">hide attacks further than(hours) </font>
6438 </td>
6439 <td style="text-align:center; width:auto; background-color:${headerColor}" >
6440 <input type="number" style="text-align:center;" id="settings_further" min="0" max="200" placeholder="100">
6441 </td>
6442 </tr>
6443 <tr>
6444 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6445 <input type="checkbox" value="hide_closer_attacks">
6446 </td>
6447 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6448 <font style="margin:5px" color="${titleColor}">hide attacks closer than(hours) </font>
6449 </td>
6450 <td style="text-align:center; width:auto; background-color:${headerColor}" >
6451 <input type="number" style="text-align:center;" id="settings_closer" min="0" max="200" placeholder="20">
6452 </td>
6453 </tr>
6454 <tr>
6455 <td style="text-align:left; width:auto; background-color:${headerColor}" colspan="2">
6456 <font style="margin:5px" color="${titleColor}">snipe has(pop) </font>
6457 </td>
6458 <td style="text-align:center; width:auto; background-color:${headerColor}" >
6459 <input type="number" style="text-align:center;" id="settings_pop" min="0" max="20000" value="1000" placeholder="1000">
6460 </td>
6461 </tr>
6462 <tr>
6463 <td style="text-align:left; width:auto; background-color:${headerColor}" colspan="2">
6464 <font style="margin:5px" color="${titleColor}">small attack has less than(pop) </font>
6465 </td>
6466 <td style="text-align:center; width:auto; background-color:${headerColor}" >
6467 <input type="number" style="text-align:center;" id="settings_small_attack" min="0" max="20000" value="5000" placeholder="5000">
6468 </td>
6469 </tr>
6470 <tr>
6471 <td style="text-align:left; width:auto; background-color:${headerColor}" colspan="2">
6472 <font style="margin:5px" color="${titleColor}">medium attack has less than(pop) </font>
6473 </td>
6474 <td style="text-align:center; width:auto; background-color:${headerColor}" >
6475 <input type="number" style="text-align:center;" id="settings_medium_attack" min="0" max="20000" value="10000" placeholder="10000">
6476 </td>
6477 </tr>
6478 <tr>
6479 <td style="text-align:left; width:auto; background-color:${headerColor}" colspan="2">
6480 <font style="margin:5px" color="${titleColor}">fangs has(catapults) </font>
6481 </td>
6482 <td style="text-align:center; width:auto; background-color:${headerColor}" >
6483 <input type="number" style="text-align:center;" id="settings_fang_cat" min="0" max="20000" value="100" placeholder="100">
6484 </td>
6485 </tr>
6486
6487
6488
6489 </table>
6490
6491 </div></center>
6492 `
6493
6494 if(document.getElementById("table_settings")==null)
6495 document.getElementById("div_settings").innerHTML=html_table
6496 else{
6497 $("#div_rank_attacker").hide()
6498 $("#div_rank_defender").hide()
6499 $("#div_upload_time").hide()
6500 $("#div_settings").toggle(500)
6501 }
6502
6503
6504 //initialize settings only if it's visible
6505
6506 if(localStorage.getItem(game_data.world+"save_settings")!=null ){
6507 let list_checkbox=JSON.parse(localStorage.getItem(game_data.world+"save_settings"))[0]
6508
6509 $('#div_settings input[type=checkbox]').each(function (index,elem) {
6510 this.checked=list_checkbox[index]
6511 // console.log(elem.value)
6512 });
6513
6514 let list_input=JSON.parse(localStorage.getItem(game_data.world+"save_settings"))[1]
6515 $('#div_settings input[type=number]').each(function (index,elem) {
6516 // var checked = this.checked
6517 this.value=list_input[index]
6518 });
6519
6520 let value_radio=JSON.parse(localStorage.getItem(game_data.world+"save_settings"))[2]
6521 $(`input[name='type_info'][value='${value_radio}'`).attr("checked",true)
6522
6523 }
6524
6525
6526
6527 //save settings
6528 $("#div_settings input[type=checkbox],#div_settings input[type=number], input[name='type_info']").on("mouseup input",()=>{
6529 console.log("save")
6530 let list_checkbox=[]
6531 let list_input=[]
6532 //save checkbox
6533 $('#div_settings input[type=checkbox]').each(function () {
6534 var checked = this.checked
6535 list_checkbox.push(checked)
6536 });
6537 //save inputs
6538 $('#div_settings input[type=number] ').each(function () {
6539 // var checked = this.checked
6540 var value=this.value
6541 // console.log(value)
6542 list_input.push(value)
6543 });
6544 //save radio button
6545 let value_radio=$("input[name='type_info']:checked").val()
6546
6547
6548
6549 let list_final=[list_checkbox,list_input,value_radio]
6550 localStorage.setItem(game_data.world+"save_settings",JSON.stringify(list_final))
6551
6552 })
6553
6554
6555 $("#btn_apply").on("click",()=>{
6556 $("#div_container_view").remove();
6557 viewSupport()
6558 })
6559 $("#btn_clear_memory").on("click",()=>{
6560 localStorage.removeItem(game_data.world+"map_exist_support")
6561 UI.SuccessMessage("local storage is cleared",1000)
6562 })
6563
6564}
6565
6566/////////////////////////////////////////////////////////////////create table ranking atackers//////////////////////////////////////////////////////
6567
6568function createTableRankingAttackers(map_ranking){
6569
6570
6571 let html=`
6572 <center>
6573 <div>
6574 <table id="table_rank" border="1" style="width: 60%;background-color:${backgroundColor};border-color:${borderColor}">
6575 <tr>
6576 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6577 <center style="margin:10px" ><font color="${titleColor}">nr</font></center>
6578 </td>
6579 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6580 <center style="margin:10px" ><font color="${titleColor}">player name</font></center>
6581 </td>
6582 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6583 <center style="margin:10px" ><a href="#" id="sort_fakes_att"><font color="${titleColor}">fakes</font><a/></center>
6584 </td>
6585 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6586 <center style="margin:10px" ><a href="#" id="sort_nukes_att"><font color="${titleColor}">nukes</font><a/></center>
6587 </td>
6588 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6589 <center style="margin:10px" ><a href="#" id="sort_fangs_att"><font color="${titleColor}">fangs</font><a/></center>
6590 </td>
6591 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6592 <center style="margin:10px" ><a href="#" id="sort_nobles_att"><font color="${titleColor}">nobles</font><a/></center>
6593 </td>
6594 </tr>`
6595
6596 Array.from(map_ranking.keys()).forEach((key,index)=>{
6597 let obj_attacks=map_ranking.get(key)
6598 html+=`
6599 <tr>
6600 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6601 <center><font style="margin:0px" color="${titleColor}">${index+1}</font></center>
6602 </td>
6603 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6604 <center><font style="margin:0px" color="${titleColor}">${obj_attacks.player_origin_name}</font></center>
6605 </td>
6606 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6607 <center><font style="margin:0px" color="${titleColor}">${obj_attacks.nr_fakes}</font></center>
6608 </td>
6609 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6610 <center><font style="margin:0px" color="${titleColor}">${obj_attacks.nr_nukes}</font></center>
6611 </td>
6612 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6613 <center><font style="margin:0px" color="${titleColor}">${obj_attacks.nr_fangs}</font></center>
6614 </td>
6615 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6616 <center><font style="margin:0px" color="${titleColor}">${obj_attacks.nr_nobles}</font></center>
6617 </td>
6618 </tr>
6619
6620 `
6621 })
6622 html+=`
6623 </table></div></center>`
6624 if(document.getElementById("div_rank_attacker").children.length==0 ){
6625 document.getElementById("div_rank_attacker").innerHTML=html
6626 console.log("initialize rank attacker")
6627 }
6628 else{
6629 $("#div_settings").hide()
6630 $("#div_rank_defender").hide()
6631 $("#div_upload_time").hide()
6632 $("#div_rank_attacker").toggle(500)
6633 }
6634
6635
6636
6637 $("#sort_fakes_att").off("click")
6638 $("#sort_nukes_att").off("click")
6639 $("#sort_fangs_att").off("click")
6640 $("#sort_nobles_att").off("click")
6641
6642 //sort by nr fakes
6643 $("#sort_fakes_att").on("click",()=>{
6644 map_ranking = new Map([...map_ranking.entries()].sort((o1,o2)=>{
6645 return (o1[1].nr_fakes>o2[1].nr_fakes)?-1:(o1[1].nr_fakes<o2[1].nr_fakes)?1:0
6646 }))
6647 document.getElementById("div_rank_attacker").innerHTML=""
6648 createTableRankingAttackers(map_ranking)
6649 })
6650 //sort by nr nukes
6651 $("#sort_nukes_att").on("click",()=>{
6652 map_ranking = new Map([...map_ranking.entries()].sort((o1,o2)=>{
6653 return (o1[1].nr_nukes>o2[1].nr_nukes)?-1:(o1[1].nr_nukes<o2[1].nr_nukes)?1:0
6654 }))
6655 console.log("sort by nukes")
6656 document.getElementById("div_rank_attacker").innerHTML=""
6657 createTableRankingAttackers(map_ranking)
6658 })
6659 //sort by nr fangs
6660 $("#sort_fangs_att").on("click",()=>{
6661 map_ranking = new Map([...map_ranking.entries()].sort((o1,o2)=>{
6662 return (o1[1].nr_fangs>o2[1].nr_fangs)?-1:(o1[1].nr_fangs<o2[1].nr_fangs)?1:0
6663 }))
6664 console.log("sort by fangs")
6665 document.getElementById("div_rank_attacker").innerHTML=""
6666 createTableRankingAttackers(map_ranking)
6667 })
6668 //sort by nr nobles
6669 $("#sort_nobles_att").on("click",()=>{
6670 map_ranking = new Map([...map_ranking.entries()].sort((o1,o2)=>{
6671 return (o1[1].nr_nobles>o2[1].nr_nobles)?-1:(o1[1].nr_nobles<o2[1].nr_nobles)?1:0
6672 }))
6673 console.log("sort by nobles")
6674 document.getElementById("div_rank_attacker").innerHTML=""
6675 createTableRankingAttackers(map_ranking)
6676 })
6677
6678
6679}
6680
6681
6682/////////////////////////////////////////////////////////////////create table ranking defenders//////////////////////////////////////////////////////
6683
6684function createTableRankingDefenders(map_ranking){
6685
6686
6687 let html=`
6688 <center>
6689 <div>
6690 <table id="table_rank" border="1" style="width: 60%;background-color:${backgroundColor};border-color:${borderColor}">
6691 <tr>
6692 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6693 <center style="margin:10px" ><font color="${titleColor}">nr</font></center>
6694 </td>
6695 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6696 <center style="margin:10px" ><font color="${titleColor}">player name</font></center>
6697 </td>
6698 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6699 <center style="margin:10px" ><a href="#" id="sort_fakes_def"><font color="${titleColor}">fakes</font><a/></center>
6700 </td>
6701 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6702 <center style="margin:10px" ><a href="#" id="sort_nukes_def"><font color="${titleColor}">nukes</font><a/></center>
6703 </td>
6704 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6705 <center style="margin:10px" ><a href="#" id="sort_fangs_def"><font color="${titleColor}">fangs</font><a/></center>
6706 </td>
6707 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6708 <center style="margin:10px" ><a href="#" id="sort_nobles_def"><font color="${titleColor}">nobles</font><a/></center>
6709 </td>
6710 </tr>`
6711
6712 Array.from(map_ranking.keys()).forEach((key,index)=>{
6713 let obj_attacks=map_ranking.get(key)
6714 html+=`
6715 <tr>
6716 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6717 <center><font style="margin:0px" color="${titleColor}">${index+1}</font></center>
6718 </td>
6719 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6720 <center><font style="margin:0px" color="${titleColor}">${obj_attacks.player_origin_name}</font></center>
6721 </td>
6722 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6723 <center><font style="margin:0px" color="${titleColor}">${obj_attacks.nr_fakes}</font></center>
6724 </td>
6725 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6726 <center><font style="margin:0px" color="${titleColor}">${obj_attacks.nr_nukes}</font></center>
6727 </td>
6728 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6729 <center><font style="margin:0px" color="${titleColor}">${obj_attacks.nr_fangs}</font></center>
6730 </td>
6731 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6732 <center><font style="margin:0px" color="${titleColor}">${obj_attacks.nr_nobles}</font></center>
6733 </td>
6734 </tr>
6735
6736 `
6737 })
6738 html+=`
6739 </table></div></center>`
6740 if(document.getElementById("div_rank_defender").children.length==0 ){
6741 document.getElementById("div_rank_defender").innerHTML=html
6742 console.log("initialize rank defender")
6743 }
6744 else{
6745 $("#div_settings").hide()
6746 $("#div_rank_attacker").hide()
6747 $("#div_upload_time").hide()
6748 $("#div_rank_defender").toggle(500)
6749 }
6750
6751
6752
6753 $("#sort_fakes_def").off("click")
6754 $("#sort_nukes_def").off("click")
6755 $("#sort_fangs_def").off("click")
6756 $("#sort_nobles_def").off("click")
6757
6758 //sort by nr fakes
6759 $("#sort_fakes_def").on("click",()=>{
6760 map_ranking = new Map([...map_ranking.entries()].sort((o1,o2)=>{
6761 return (o1[1].nr_fakes>o2[1].nr_fakes)?-1:(o1[1].nr_fakes<o2[1].nr_fakes)?1:0
6762 }))
6763 document.getElementById("div_rank_defender").innerHTML=""
6764 createTableRankingDefenders(map_ranking)
6765 })
6766 //sort by nr nukes
6767 $("#sort_nukes_def").on("click",()=>{
6768 map_ranking = new Map([...map_ranking.entries()].sort((o1,o2)=>{
6769 return (o1[1].nr_nukes>o2[1].nr_nukes)?-1:(o1[1].nr_nukes<o2[1].nr_nukes)?1:0
6770 }))
6771 console.log("sort by nukes")
6772 document.getElementById("div_rank_defender").innerHTML=""
6773 createTableRankingDefenders(map_ranking)
6774 })
6775 //sort by nr fangs
6776 $("#sort_fangs_def").on("click",()=>{
6777 map_ranking = new Map([...map_ranking.entries()].sort((o1,o2)=>{
6778 return (o1[1].nr_fangs>o2[1].nr_fangs)?-1:(o1[1].nr_fangs<o2[1].nr_fangs)?1:0
6779 }))
6780 console.log("sort by fangs")
6781 document.getElementById("div_rank_defender").innerHTML=""
6782 createTableRankingDefenders(map_ranking)
6783 })
6784 //sort by nr nobles
6785 $("#sort_nobles_def").on("click",()=>{
6786 map_ranking = new Map([...map_ranking.entries()].sort((o1,o2)=>{
6787 return (o1[1].nr_nobles>o2[1].nr_nobles)?-1:(o1[1].nr_nobles<o2[1].nr_nobles)?1:0
6788 }))
6789 console.log("sort by nobles")
6790 document.getElementById("div_rank_defender").innerHTML=""
6791 createTableRankingDefenders(map_ranking)
6792 })
6793
6794
6795}
6796
6797
6798/////////////////////////////////////////////////////////////////create table upload time//////////////////////////////////////////////////////
6799
6800function createTableUploadTime(map_upload_time){
6801
6802
6803 let html=`
6804 <center>
6805 <div>
6806 <table id="table_rank" border="1" style="width: 80%;background-color:${backgroundColor};border-color:${borderColor}">
6807 <tr>
6808 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6809 <center style="margin:10px" ><font color="${titleColor}">nr</font></center>
6810 </td>
6811 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6812 <center style="margin:10px" ><font color="${titleColor}">player name</font></center>
6813 </td>
6814 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6815 <center style="margin:10px" ><a href="#" id="sort_reports"><font color="${titleColor}">reports</font><a/></center>
6816 </td>
6817 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6818 <center style="margin:10px" ><a href="#" id="sort_incomings"><font color="${titleColor}">incomings</font><a/></center>
6819 </td>
6820 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6821 <center style="margin:10px" ><a href="#" id="sort_commands"><font color="${titleColor}">commands</font><a/></center>
6822 </td>
6823
6824 </tr>`
6825
6826 Array.from(map_upload_time.keys()).forEach((key,index)=>{
6827 let obj_upload=map_upload_time.get(key)
6828 html+=`
6829 <tr>
6830 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6831 <center><font style="margin:0px" color="${titleColor}">${index+1}</font></center>
6832 </td>
6833 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6834 <center><font style="margin:0px" color="${titleColor}">${obj_upload.name}</font></center>
6835 </td>
6836 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6837 <center><font style="margin:0px" color="${titleColor}">${parseDate(obj_upload.report_date)}</font></center>
6838 </td>
6839 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6840 <center><font style="margin:0px" color="${titleColor}">${parseDate(obj_upload.incoming_date)}</font></center>
6841 </td>
6842 <td style="text-align:left; width:auto; background-color:${headerColor}" >
6843 <center><font style="margin:0px" color="${titleColor}">${parseDate(obj_upload.command_date)}</font></center>
6844 </td>
6845 </tr>
6846
6847 `
6848 })
6849 html+=`
6850 </table></div></center>`
6851 if(document.getElementById("div_upload_time").children.length==0 ){
6852 document.getElementById("div_upload_time").innerHTML=html
6853 console.log("initialize table upload time")
6854 }
6855 else{
6856 $("#div_settings").hide()
6857 $("#div_rank_defender").hide()
6858 $("#div_rank_attacker").hide()
6859 $("#div_upload_time").toggle(500)
6860 console.log("rank attacker")
6861 }
6862
6863
6864 $("#sort_reports").off("click")
6865 $("#sort_incomings").off("click")
6866 $("#sort_commands").off("click")
6867
6868 //sort by nr date upload reports
6869 $("#sort_reports").on("click",()=>{
6870 map_upload_time = new Map([...map_upload_time.entries()].sort((o1,o2)=>{
6871 return (new Date(o1[1].report_date).getTime() > new Date(o2[1].report_date).getTime())?-1:
6872 (new Date(o1[1].report_date).getTime() < new Date(o2[1].report_date).getTime())?1:0
6873 }))
6874 console.log("sort by report")
6875 document.getElementById("div_upload_time").innerHTML=""
6876 createTableUploadTime(map_upload_time)
6877 })
6878 //sort by nr date upload incomings
6879 $("#sort_incomings").on("click",()=>{
6880 map_upload_time = new Map([...map_upload_time.entries()].sort((o1,o2)=>{
6881 return (new Date(o1[1].incoming_date).getTime() > new Date(o2[1].incoming_date).getTime())?-1:
6882 (new Date(o1[1].incoming_date).getTime() < new Date(o2[1].incoming_date).getTime())?1:0
6883 }))
6884 console.log("sort by incomings")
6885 document.getElementById("div_upload_time").innerHTML=""
6886 createTableUploadTime(map_upload_time)
6887 })
6888 //sort by nr date upload commands
6889 $("#sort_commands").on("click",()=>{
6890 map_upload_time = new Map([...map_upload_time.entries()].sort((o1,o2)=>{
6891 return (new Date(o1[1].command_date).getTime() > new Date(o2[1].command_date).getTime())?-1:
6892 (new Date(o1[1].command_date).getTime() < new Date(o2[1].command_date).getTime())?1:0
6893 }))
6894 console.log("sort by commands")
6895 document.getElementById("div_upload_time").innerHTML=""
6896 createTableUploadTime(map_upload_time)
6897 })
6898
6899
6900
6901}
6902
6903function parseDate(time){
6904 let date=new Date(time)
6905
6906 let year=date.getFullYear();
6907 let month=("00"+(date.getMonth()+1)).slice(-2)
6908 let day=("00"+date.getDate()).slice(-2)
6909 let hours=("00"+date.getHours()).slice(-2)
6910 let minutes=("00"+date.getMinutes()).slice(-2)
6911 let seconds=("00"+date.getSeconds()).slice(-2)
6912 let result=`${month}/${day}/${year} ${hours}:${minutes}:${seconds}`
6913 return result
6914}
6915
6916////////////////////////////////////////////////sort by attacks,supports,nobles,snipes,recaps////////////////////////////////////////////////////////
6917
6918function sortInfoIncomings(map_playerId,mapVillage){
6919 //////////////////////////////////////////////////////////////sort by attacks///////////////////////////////////////////
6920 document.getElementById("sort_by_attacks").addEventListener("click",()=>{
6921 map_playerId= new Map([...map_playerId.entries()].sort((o1,o2) =>{
6922 return (o1[1].nr_attacks_total>o2[1].nr_attacks_total)?-1:(o1[1].nr_attacks_total<o2[1].nr_attacks_total)?1:0;
6923 }))
6924 Array.from(map_playerId.keys()).forEach(key=>{
6925 let obj=map_playerId.get(key)
6926 obj.list_coords.sort((o1,o2)=>{
6927 return (o1.nr_attacks>o2.nr_attacks)?-1:(o1.nr_attacks<o2.nr_attacks)?1:0
6928 })
6929 map_playerId.set(key,obj)
6930 })
6931 document.getElementById("tbody_player").remove()
6932 createTablePlayers(map_playerId,mapVillage)
6933 })
6934 //////////////////////////////////////////////////////////////sort by supports///////////////////////////////////////////
6935
6936 document.getElementById("sort_by_supports").addEventListener("click",()=>{
6937 map_playerId= new Map([...map_playerId.entries()].sort((o1,o2) =>{
6938 return (o1[1].nr_supports_total>o2[1].nr_supports_total)?-1:(o1[1].nr_supports_total<o2[1].nr_supports_total)?1:0;
6939 }))
6940 Array.from(map_playerId.keys()).forEach(key=>{
6941 let obj=map_playerId.get(key)
6942 obj.list_coords.sort((o1,o2)=>{
6943 return (o1.nr_supports>o2.nr_supports)?-1:(o1.nr_supports<o2.nr_supports)?1:0
6944 })
6945 map_playerId.set(key,obj)
6946 })
6947 document.getElementById("tbody_player").remove()
6948 createTablePlayers(map_playerId,mapVillage)
6949
6950 })
6951 //////////////////////////////////////////////////////////////sort by nobles///////////////////////////////////////////
6952 document.getElementById("sort_by_nobles").addEventListener("click",()=>{
6953 map_playerId= new Map([...map_playerId.entries()].sort((o1,o2) =>{
6954 return (o1[1].nr_nobles_total>o2[1].nr_nobles_total)?-1:(o1[1].nr_nobles_total<o2[1].nr_nobles_total)?1:0;
6955 }))
6956 Array.from(map_playerId.keys()).forEach(key=>{
6957 let obj=map_playerId.get(key)
6958 obj.list_coords.sort((o1,o2)=>{
6959 return (o1.nr_nobles>o2.nr_nobles)?-1:(o1.nr_nobles<o2.nr_nobles)?1:0
6960 })
6961 map_playerId.set(key,obj)
6962 })
6963 document.getElementById("tbody_player").remove()
6964 createTablePlayers(map_playerId,mapVillage)
6965 })
6966 //////////////////////////////////////////////////////////////sort by snipes///////////////////////////////////////////
6967
6968 document.getElementById("sort_by_snipes").addEventListener("click",()=>{
6969 map_playerId= new Map([...map_playerId.entries()].sort((o1,o2) =>{
6970 return (o1[1].nr_snipe_total>o2[1].nr_snipe_total)?-1:(o1[1].nr_snipe_total<o2[1].nr_snipe_total)?1:0;
6971 }))
6972 Array.from(map_playerId.keys()).forEach(key=>{
6973 let obj=map_playerId.get(key)
6974 obj.list_coords.sort((o1,o2)=>{
6975 return (o1.nr_snipe>o2.nr_snipe)?-1:(o1.nr_snipe<o2.nr_snipe)?1:(o1.nr_sniped>o2.nr_sniped)?-1:(o1.nr_sniped<o2.nr_sniped)?1:0;
6976 })
6977 map_playerId.set(key,obj)
6978 })
6979 document.getElementById("tbody_player").remove()
6980 createTablePlayers(map_playerId,mapVillage)
6981 })
6982 //////////////////////////////////////////////////////////////sort by recaps///////////////////////////////////////////
6983 document.getElementById("sort_by_recaps").addEventListener("click",()=>{
6984 map_playerId= new Map([...map_playerId.entries()].sort((o1,o2) =>{
6985 return (o1[1].nr_recap_total>o2[1].nr_recap_total)?-1:(o1[1].nr_recap_total<o2[1].nr_recap_total)?1:0;
6986 }))
6987 Array.from(map_playerId.keys()).forEach(key=>{
6988 let obj=map_playerId.get(key)
6989 obj.list_coords.sort((o1,o2)=>{
6990 return (o1.nr_recap>o2.nr_recap)?-1:(o1.nr_recap<o2.nr_recap)?1:(o1.nr_recaped>o2.nr_recaped)?-1:(o1.nr_recaped<o2.nr_recaped)?1:0
6991 })
6992 map_playerId.set(key,obj)
6993 })
6994 document.getElementById("tbody_player").remove()
6995 createTablePlayers(map_playerId,mapVillage)
6996 })
6997
6998}