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