Advertisement
madalino

barbs shaper

Apr 25th, 2021 (edited)
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // var troopSend = {axe:100,sword:100,light:20,heavy:20};
  2.  
  3. var backgroundColor = "#32313f";
  4. var borderColor = "#3e6147";
  5. var headerColor = "#202825";
  6. var titleColor = "#ffffdf";
  7.  
  8. var countApiKey = "barb_shaper";
  9. var countNameSpace="madalinoTribalWarsScripts"
  10.  
  11. var troopsPop = {
  12.     spear : 1,
  13.     sword : 1,
  14.     axe : 1,
  15.     archer : 1,
  16.     spy : 2,
  17.     light : 4,
  18.     marcher : 5,
  19.     heavy : 6,
  20.     ram : 5,
  21.     catapult : 8,
  22.     knight : 10,
  23.     snob : 100,
  24.     militia:1
  25. };
  26.  
  27. var buildingLevel={
  28.     level1:  2,
  29.     level2:  2,
  30.     level3:  3,
  31.     level4:  3,
  32.     level5:  3,
  33.     level6:  3,
  34.     level7:  3,
  35.     level8:  3,
  36.     level9:  4,
  37.     level10: 4,
  38.     level11: 4,
  39.     level12: 5,
  40.     level13: 5,
  41.     level14: 6,
  42.     level15: 6,
  43.     level16: 6,
  44.     level17: 7,
  45.     level18: 8,
  46.     level19: 8,
  47.     level20: 9,
  48.     level21: 10,
  49.     level22: 10,
  50.     level23: 11,
  51.     level24: 12,
  52.     level25: 13,
  53.     level26: 15,
  54.     level27: 16,
  55.     level28: 17,
  56.     level29: 19,
  57.     level30: 20,
  58. }
  59.  
  60.  
  61.  
  62.  
  63. function createMainInterface(){
  64.    
  65.     let html_info=`
  66.     <div id="div_container_view" class="ui-widget-content div_remove" style="width:600px;background-color:${backgroundColor};cursor:move;z-index:50;">
  67.         <div class="close-btn" class="btn_close" onclick="closeWindow()" style="position:absolute;top:10px;right: 10px;"><b><a href=#><font color="${titleColor}">X</font></b></a></div>
  68.         <h2><center style="margin:10px"><u><font color="${titleColor}">Barbs shaper</font></u></center></h2>
  69.         <center>
  70.             <input class="btn evt-confirm-btn btn-confirm-yes" type="button" onclick="createTableSettings()" style="margin:10px" value="Settings">
  71.             <input class="btn evt-confirm-btn btn-confirm-yes" type="button" onclick="calculatesLaunches()" id="btn_start" style="margin:10px" value="start">
  72.  
  73.         </center>
  74.         <center style="margin:10px" ><div id="div_settings" hidden> </div></center>
  75.  
  76.         <div id="div_parent_wall"  hidden>
  77.             <a href="#"> <center style="margin:10px"><font color="${titleColor}" onclick="$('#div_wall').toggle(500)">downgrade wall</font></center></a>
  78.             <center style="margin:10px" ><div id="div_wall" > </div></center>
  79.         </div>
  80.  
  81.         <div id="div_parent_main"  hidden>
  82.             <a href="#" ><center style="margin:10px"><font color="${titleColor}" onclick="$('#div_main').toggle(500)">downgrade main</font></center></a>
  83.             <center style="margin:10px" ><div id="div_main" > </div></center>
  84.         </div>
  85.  
  86.         <div id="div_parent_barracks" hidden>
  87.             <a href="#" ><center style="margin:10px"><font color="${titleColor}" onclick="$('#div_barracks').toggle(500)">downgrade barracks</font></center></a>
  88.             <center style="margin:10px" ><div id="div_barracks" > </div></center>
  89.         </div>
  90.  
  91.         <div id="div_parent_stable" hidden>
  92.             <a href="#" ><center style="margin:10px"><font color="${titleColor}" onclick="$('#div_stable').toggle(500)">downgrade stable</font></center></a>
  93.             <center style="margin:10px" ><div id="div_stable" > </div></center>
  94.         </div>
  95.  
  96.         <div id="div_parent_market" hidden>
  97.             <a href="#" ><center style="margin:10px"><font color="${titleColor}" onclick="$('#div_market').toggle(500)">downgrade market</font></center></a>
  98.             <center style="margin:10px" ><div id="div_market" > </div></center>
  99.         </div>
  100.  
  101.         <div id="div_parent_farm" hidden>
  102.             <a href="#" ><center style="margin:10px"><font color="${titleColor}" onclick="$('#div_farm').toggle(500)">downgrade farm</font></center></a>
  103.             <center style="margin:10px" ><div id="div_farm" > </div></center>
  104.         </div>
  105.  
  106.  
  107.  
  108.  
  109.         <div id="div_table_view" hidden> </div>
  110.         <div id="div_table_send" > </div>
  111.  
  112.     </div>`
  113.     ////////////////////////////////////////add and remove window from page///////////////////////////////////////////
  114.     $("#div_container_view").remove()
  115.     $("#contentContainer").eq(0).prepend(html_info);
  116.     $("#mobileContent").eq(0).prepend(html_info);
  117.  
  118.     //for mobile browser
  119.  
  120.  
  121.  
  122.     if(game_data.device=="desktop"){
  123.         $("#div_container_view").css("position","fixed");
  124.         $("#div_container_view").draggable();
  125.     }
  126.    
  127. }
  128.  
  129. createMainInterface()
  130. createTableSettings()
  131.  
  132. function closeWindow(){
  133.     document.getElementById("div_container").remove();
  134. }
  135.  
  136.  
  137. function hitCountApi(){
  138.     $.getJSON(`https://api.countapi.xyz/hit/${countNameSpace}/${countApiKey}`, response=>{
  139.         console.log(`This script has been run ${response.value} times`);
  140.     });
  141. }
  142. hitCountApi()
  143.  
  144.  
  145.  
  146. async function calculatesLaunches(){
  147.     let mapBuildings = await getBuildings()
  148.     let listTroops = getTroops()
  149.     let downgradeBuildings = Array.from($("#settings_table input[type=checkbox]:checked")).map(e=>e.value.replace("downgrade_",""))
  150.     let nr_launches=parseInt(document.getElementById("nr_launches").value)
  151.     nr_launches=(Number.isNaN(nr_launches)==true || nr_launches==0)?100:nr_launches
  152.  
  153.     let extra_level=parseInt(document.getElementById("extra_level").value)
  154.     extra_level=(Number.isNaN(extra_level)==true || extra_level>=10)?1:extra_level
  155.  
  156.  
  157.     let sendEscort = $("input[type=checkbox][value=escort_cats]").is(":checked")
  158.     console.log("mapBuildings",mapBuildings)
  159.     console.log("listTroops",listTroops)
  160.    
  161.     if(downgradeBuildings.length==0){
  162.         UI.ErrorMessage("select downgrade building from settings")
  163.     }
  164.  
  165.  
  166.     let mapLaunches=new Map()
  167.     let startCalcLaunches=new Date().getTime()
  168.     let output_barbs_error=""
  169.     let count_launches=0
  170.     Array.from(mapBuildings.keys()).forEach(key=>{
  171.         let obj_buildings=mapBuildings.get(key)
  172.         let coordBarb=key
  173.         let xBarb=coordBarb.split("|")[0]
  174.         let yBarb=coordBarb.split("|")[1]
  175.        
  176.         //calculate distance for current barb
  177.         for(let i=0;i<listTroops.length;i++){
  178.             let distance=calcDistance(listTroops[i].coord,key)
  179.             listTroops[i].distance=distance
  180.         }
  181.         //sort own coords by distance from the current barb
  182.         listTroops.sort((o1,o2)=>{
  183.             return (o1.distance > o2.distance)?1:(o1.distance < o2.distance)?1:0
  184.         })
  185.  
  186.         //for each building selected
  187.         for(let i=0;i<downgradeBuildings.length;i++){
  188.             let keyBuilding=downgradeBuildings[i]
  189.             $(`#div_parent_${keyBuilding}`).show()
  190.            
  191.             //show only x launches
  192.             if(count_launches>nr_launches){
  193.                 break;
  194.             }
  195.             //if wall is higher than 10 ignore this barb
  196.             if(obj_buildings["wall"]!=undefined){
  197.                 if(obj_buildings["total_pop"]>0){
  198.                     let error=`barb ${key} has ${obj_buildings["total_pop"]}`
  199.                     console.log(error)
  200.                     output_barbs_error+=error+"\n"
  201.                     break;
  202.                    
  203.                 }
  204.                 else if(obj_buildings["wall"].level>10){
  205.                     let error=`barb ${key} has wall at lv${obj_buildings["wall"].level}`
  206.                     console.log(error)
  207.                     output_barbs_error+=error+"\n"
  208.                     break;
  209.                 }
  210.             }
  211.  
  212.  
  213.             if(obj_buildings[keyBuilding]!=undefined){//some buildings have level 0
  214.                
  215.                 //for each own coord
  216.                 for(let j=0;j<listTroops.length;j++){
  217.                     let levelBuilding=obj_buildings[keyBuilding].level
  218.                     let nameBuilding=obj_buildings[keyBuilding].name
  219.                     // console.log(nameBuilding,levelBuilding)
  220.                    
  221.  
  222.                     for(let k=levelBuilding;k>0;k--){//for each level building downgrade if it's possible
  223.                         let level_cat=extra_level+k
  224.                         let nrCats=buildingLevel[`level${level_cat}`]//cats need it for downgrading 1 level
  225.  
  226.  
  227.                         let href_rally=listTroops[j].linkBase
  228.                         if(listTroops[j].availableTroupes["catapult"] >= nrCats && obj_buildings[keyBuilding].level > 0  ){//if has enough cats for the current level
  229.                             //if a building except wall has lv 1 break loop
  230.                             if(keyBuilding != "wall" && obj_buildings[keyBuilding].level == 1){
  231.                                 break;
  232.                             }
  233.                            
  234.                            
  235.                             //check if exist a small amount of axe, ligh, sword or heavy to send with cats
  236.                             if(keyBuilding == "wall"  || sendEscort == true ){
  237.                                 if(listTroops[j].availableTroupes["axe"] > troopSend["axe"] && troopSend["axe"]>0 ){
  238.                                     href_rally+=`&axe=${troopSend["axe"]}&`
  239.                                     listTroops[j].availableTroupes["axe"]=listTroops[j].availableTroupes["axe"]-troopSend["axe"]
  240.                                 }
  241.                                 else if(listTroops[j].availableTroupes["light"] > troopSend["light"] && troopSend["light"]>0){
  242.                                     href_rally+=`&light=${troopSend["light"]}&`
  243.                                     listTroops[j].availableTroupes["light"]=listTroops[j].availableTroupes["light"]-troopSend["light"]
  244.                                 }
  245.                                 else if(listTroops[j].availableTroupes["sword"] > troopSend["sword"] && troopSend["sword"]>0){
  246.                                     href_rally+=`&sword=${troopSend["sword"]}&`
  247.                                     listTroops[j].availableTroupes["sword"]=listTroops[j].availableTroupes["sword"]-troopSend["sword"]
  248.                                 }
  249.                                 else if(listTroops[j].availableTroupes["heavy"] > troopSend["heavy"] && troopSend["heavy"]>0){
  250.                                     href_rally+=`&heavy=${troopSend["heavy"]}&`
  251.                                     listTroops[j].availableTroupes["heavy"]=listTroops[j].availableTroupes["heavy"] - troopSend["heavy"]
  252.                                 }
  253.                                 else{
  254.                                     break;//if wall cannot be downgraded go to the next own coord
  255.                                 }
  256.                             }
  257.                             href_rally+=`&catapult=${nrCats}&x=${xBarb}&y=${yBarb}`
  258.                            
  259.  
  260.                             //add launches by building
  261.                             if(mapLaunches.has(keyBuilding)){
  262.                                 let list_launches=mapLaunches.get(keyBuilding)
  263.                                 list_launches.push(href_rally)
  264.                                 mapLaunches.set(keyBuilding,list_launches)
  265.                                 count_launches++
  266.                             }else{
  267.                                 mapLaunches.set(keyBuilding,[
  268.                                     href_rally
  269.                                 ])
  270.                                 count_launches++
  271.                             }
  272.  
  273.                             //update troops and level buildings
  274.                             listTroops[j].availableTroupes["catapult"] = listTroops[j].availableTroupes["catapult"]-nrCats
  275.                             obj_buildings[keyBuilding].level = obj_buildings[keyBuilding].level-1
  276.  
  277.                             //not enough cats break loop
  278.                             if(listTroops[j].availableTroupes["catapult"] < 1){
  279.                                 break;
  280.                             }
  281.  
  282.                         }
  283.                     }
  284.                    
  285.                     // if every building was downgraded break the loop
  286.                     let leftLevelBuildings=0;
  287.                     for(let k=0;k<downgradeBuildings.length;k++){
  288.                         let keyBuildingCheck=downgradeBuildings[k]
  289.                         if(obj_buildings[keyBuildingCheck]!=undefined)
  290.                             leftLevelBuildings += obj_buildings[keyBuildingCheck].level
  291.                     }
  292.                     // console.log("leftLevelBuildings",leftLevelBuildings)
  293.                     if(downgradeBuildings.length >= leftLevelBuildings){
  294.                         break;
  295.                     }
  296.  
  297.  
  298.  
  299.                 }
  300.  
  301.             }
  302.         }
  303.  
  304.     })
  305.  
  306.     let stopCalcLaunches=new Date().getTime()
  307.     console.log("time process: "+(stopCalcLaunches-startCalcLaunches))
  308.     console.log("mapLaunches",mapLaunches)
  309.  
  310.     Array.from(mapLaunches.keys()).forEach(key=>{
  311.         let list_launch = mapLaunches.get(key)
  312.         let divId=`div_${key}`
  313.         createButtons(list_launch,divId)
  314.        
  315.     })
  316.  
  317.  
  318.  
  319.  
  320.     document.getElementById("btn_start").setAttribute("get_troops","true")
  321. }
  322.  
  323. ////////////////////////////////////////////////get troops from combined page////////////////////////////////////////////////////////////////////
  324.  
  325.  
  326. function getTroops(){
  327.  
  328.     let url_combined=game_data.link_base_pure+"overview_villages&mode=combined"
  329.     if(document.getElementById("combined_table")==null){
  330.         document.body.innerHTML=httpGet(url_combined);
  331.    
  332.         console.log("create main interface")
  333.         createMainInterface()
  334.         console.log("create main settings")
  335.         createTableSettings()
  336.     }
  337.  
  338.  
  339.     if(document.getElementById("btn_start").getAttribute("get_troops")=="true"){
  340.         console.log("get troops")
  341.         let start=new Date().getTime();
  342.         let text_page=httpGet(url_combined)
  343.         let table=text_page.match(/<table id="combined_table"((.|\n)+)/)[0].split("<\/table>")[0]+"</table>"
  344.         document.getElementById("combined_table").innerHTML=table
  345.         let stop=new Date().getTime();
  346.         console.log("time ajax for refreshing combined table",(stop-start))
  347.     }
  348.  
  349.  
  350.  
  351.    
  352.     let table_combined=document.getElementById("combined_table").getElementsByTagName("tr")
  353.     let units=game_data.units
  354.     let troops_used=["axe","sword","light","heavy","catapult"]//units for snipes
  355.     let list_available=[]
  356.  
  357.    
  358.     for(let i=1;i<table_combined.length;i++){
  359.         let vectorTroupes=Array.from(table_combined[i].getElementsByClassName("unit-item")).map(e=>{return parseInt(e.innerText)})
  360.         let currentCoord=table_combined[i].getElementsByClassName("quickedit-label")[0].innerText.match(/[0-9]{3}\|[0-9]{3}/)[0]
  361.         let linkBase=table_combined[i].getElementsByClassName("quickedit-content")[0].getElementsByTagName("a")[0].href.replace("overview","place")
  362.         // console.log(linkBase)
  363.         // console.log("troupes available",vectorTroupes)
  364.         // console.log(vectorTroupes)
  365.         let availableTroupes={}
  366.         let totalPop=0;
  367.         //create an object with troops available
  368.         for(let j=0;j<units.length-1;j++){
  369.             if(troops_used.includes(units[j])){//get only defensive troops for snipes
  370.                 availableTroupes[units[j]]=vectorTroupes[j]
  371.                 if(units[j]!="catapult")
  372.                     totalPop+=vectorTroupes[j]*troopsPop[units[j]]
  373.             }
  374.         }
  375.         let minimumCats=10
  376.         let minimumPop=50
  377.         // console.log("availableTroupes",availableTroupes)
  378.         if(availableTroupes.catapult >= minimumCats && totalPop >= minimumPop){
  379.  
  380.             list_available.push({
  381.                 coord:currentCoord,
  382.                 availableTroupes:availableTroupes,
  383.                 linkBase:linkBase
  384.             })
  385.         }
  386.  
  387.     }
  388.     return list_available
  389.  
  390.    
  391.    
  392. }
  393.  
  394. ////////////////////////////////////////////////go to each report and get lv buildings /////////////////////////////////////////////////////////
  395.  
  396.  
  397. async function getBuildings()
  398. {
  399.     let report_old_hours=parseInt(document.getElementById("old_reports").value)
  400.     report_old_hours=(Number.isNaN(report_old_hours)==true || report_old_hours==0)?5:report_old_hours
  401.     let folderName = document.getElementById("folder_name").value
  402.  
  403.  
  404.     let href_link = await getLinks(report_old_hours,folderName).catch(e=>console.log(e))
  405.     let mapInfoVillages = await getInfoVIllages()
  406.     let mapBuildings=new Map()
  407.  
  408.     if(href_link == undefined || href_link.length==0){
  409.         UI.ErrorMessage("no reports found",1000)
  410.         throw new Error("no reports found")
  411.     }
  412.     href_link=href_link.reverse()
  413.     console.log("Starting...");
  414.     const run = async () => {
  415.         for(let i=0;i<href_link.length;i++){
  416.             document.body.innerHTML=await ajaxGetData(href_link[i])
  417.             if(document.getElementsByClassName("village_anchor").length==0){
  418.                 alert("captcha on, resolve captcha and rerun the script")
  419.                 throw new Error("captcha")
  420.             }
  421.  
  422.             let coordDefender=document.getElementsByClassName("village_anchor")[1].innerText.match(/[0-9]{3}\|[0-9]{3}/)[0];
  423.            
  424.            
  425.             if(document.getElementById("attack_spy_building_data")!=null && mapInfoVillages.has(coordDefender)){//&& mapInfoVillages.has(coordDefender)
  426.                 let list_buildings=JSON.parse(document.getElementById("attack_spy_building_data").value)
  427.                 let obj_buildings={}
  428.                 for(let j=0;j<list_buildings.length;j++){
  429.                     obj_buildings[list_buildings[j].id]={
  430.                         name:list_buildings[j].name,
  431.                         level:parseInt(list_buildings[j].level)
  432.                     }
  433.                 }
  434.  
  435.                 var defenseInfo = $("#attack_info_def");
  436.                 let 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()) } })
  437.                 let 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()) } })
  438.    
  439.                 let total_pop=0
  440.                 for(let i=0;i<defendingArmy.length;i++){
  441.                     let value_troops_remaining = defendingArmy[i].count-defendingArmyLosses[i].count
  442.                     total_pop+=value_troops_remaining * troopsPop[defendingArmy[i].type]
  443.                 }
  444.                 console.log(total_pop)
  445.                 obj_buildings.total_pop=total_pop
  446.  
  447.                 mapBuildings.set(coordDefender,obj_buildings)
  448.             }
  449.  
  450.             UI.InfoMessage("left reports: "+(href_link.length-i))
  451.         }
  452.     };
  453.     await run();
  454.     console.log("Done!");
  455.     // console.log(mapBuildings)
  456.  
  457.     let url_combined=game_data.link_base_pure+"overview_villages&mode=combined"
  458.     if(document.getElementById("combined_table")==null){
  459.         document.body.innerHTML=httpGet(url_combined);
  460.    
  461.         console.log("create main interface")
  462.         createMainInterface()
  463.         console.log("create main settings")
  464.         createTableSettings()
  465.     }
  466.  
  467.  
  468.     return mapBuildings
  469.  
  470. }
  471.  
  472.  
  473.  
  474.  
  475. function ajaxGetData(url){
  476.     return new Promise((resolve,reject)=>{
  477.         let start=new Date().getTime()
  478.         $.get(url,(data)=>{
  479.             let stop=new Date().getTime()
  480.  
  481.             window.setTimeout(()=>{
  482.                 resolve(data)
  483.             },200-(stop-start))
  484.         })
  485.     })
  486. }
  487.  
  488.  
  489.  
  490.  
  491. function getLinks(hours,folderName){
  492.  
  493.     // var currentPage=document.body.innerHTML;
  494.     return new Promise((resolve,reject)=>{
  495.         let list_pages=[]
  496.  
  497.         let href_reports_all= game_data.link_base_pure+"report&mode=all&group_id=-1";
  498.         document.body.innerHTML=httpGet(href_reports_all)
  499.         let href_loot_assistant=$(`a:contains('${folderName}')`).get(0).href
  500.         document.body.innerHTML=httpGet(href_loot_assistant)
  501.  
  502.        
  503.         let page_size=parseInt(document.getElementsByName("page_size")[0].value)
  504.         if(document.getElementsByClassName("vis")[1].getElementsByTagName("select").length>0){
  505.             Array.from(document.getElementsByClassName("vis")[1].getElementsByTagName("select")[0]).forEach(function(item){
  506.                 list_pages.push(item.value)
  507.             })
  508.         }
  509.         else if(document.getElementsByClassName("paged-nav-item").length>0){//all pages from the current folder
  510.             let length_page=document.getElementsByClassName("paged-nav-item").length
  511.             for(let i=0;i<length_page+1;i++){
  512.                 let current=game_data.link_base_pure+`report&mode=all&from=${i*page_size}`
  513.                 list_pages.push(current);
  514.  
  515.             }
  516.         }
  517.         else{
  518.             let current_link=game_data.link_base_pure+`report&mode=all&from=0`
  519.             list_pages.push(current_link);
  520.         }
  521.     list_pages=list_pages.reverse();
  522.  
  523.         console.log("list pages")
  524.         console.log(list_pages)
  525.    
  526.         let list_href=[];
  527.         var indexIncoming=1;
  528.         var url_length=list_pages.length
  529.         function ajaxRequest (urls) {
  530.             let current_url
  531.  
  532.             if(urls.length>0){
  533.                 current_url=urls.pop()
  534.             }
  535.             else{
  536.                 current_url="stop"
  537.             }
  538.             console.log("in functie in plm "+urls.length)
  539.             // console.log(current_url)
  540.             var start_ajax=new Date();
  541.             if (urls.length >= 0 && current_url!="stop") {
  542.                 $.ajax({
  543.                     url: current_url,
  544.                     method: 'get',
  545.                     success: (data) => {
  546.                         document.body.innerHTML=data
  547.                         let table_report= document.getElementById("report_list").firstElementChild.children;
  548.                         let year=document.getElementById("serverDate").innerText.split("/")[2];
  549.  
  550.                         //get the current date and time server
  551.                         let serverTime=document.getElementById("serverTime").innerText
  552.                         let serverDate=document.getElementById("serverDate").innerText.split("/")
  553.                         serverDate=serverDate[1]+"/"+serverDate[0]+"/"+serverDate[2]
  554.                         let date_current=new Date(serverDate+" "+serverTime)
  555.  
  556.                         for(let i=1;i<table_report.length-1;i++){
  557.                             let month_day=table_report[i].children[2].innerText;
  558.                             let date_report=new Date(year+" "+month_day)
  559.                             if(Math.abs(date_current-date_report)<hours*3600*1000){//old
  560.                                 if($(table_report[i]).find("img[src$='spy.png']").length>0 && $(table_report[i]).find("img[src$='red@2x.png']").length==0){
  561.                                     let href_page=table_report[i].getElementsByTagName("a")[0].href
  562.                                     list_href.push(href_page)
  563.                                 }
  564.                             }
  565.                         }
  566.  
  567.                         UI.InfoMessage("page "+indexIncoming+"/"+url_length)
  568.                         indexIncoming++;
  569.                         var stop_ajax=new Date();
  570.                         var dif_time=stop_ajax.getTime()-start_ajax.getTime();
  571.                         window.setTimeout(function(){
  572.                             ajaxRequest (list_pages)
  573.                         },200-dif_time)
  574.                     }
  575.                 })
  576.            
  577.             }
  578.             else
  579.             {
  580.                 UI.SuccessMessage("done",2000)
  581.                 resolve(list_href)
  582.             }
  583.         }
  584.         if(list_pages.length>0)
  585.             ajaxRequest(list_pages);
  586.         else
  587.             reject("error??")
  588.  
  589.     })
  590.    
  591. }
  592.  
  593.  
  594.  
  595. function httpGet(theUrl){
  596.     var xmlHttp = new XMLHttpRequest();
  597.     xmlHttp.open( "GET", theUrl, false ); // false for synchronous request
  598.     xmlHttp.send( null );
  599.     return xmlHttp.responseText;
  600. }
  601.  
  602.  
  603. function getInfoVIllages(){
  604.     return new Promise((resolve,reject)=>{
  605.         let dataLocalStorage=localStorage.getItem(game_data.word="barbsDB")
  606.         let mapVillageInfo=new Map()
  607.         if(dataLocalStorage==null){
  608.             let url=window.location.href.split("/game.php")[0]
  609.             let dataVillage=httpGet(url+"/map/village.txt").split(/\r?\n/);
  610.             for(let i=0;i<dataVillage.length;i++){
  611.                 let coord=dataVillage[i].split(",")[2]+"|"+dataVillage[i].split(",")[3]
  612.                 let isBarb=( parseInt(dataVillage[i].split(",")[4])==0 )?0:1 // 0 is barb 1 is not barb
  613.                 if(isBarb==0)
  614.                     mapVillageInfo.set(coord,isBarb)
  615.             }
  616.             let storeData={
  617.                 mapVillageInfo:Array.from(mapVillageInfo.entries()),
  618.                 dateInfo:new Date().getTime()
  619.             }
  620.             storeData=JSON.stringify(storeData)
  621.             storeData=lzw_encode(storeData)
  622.             localStorage.setItem(game_data.word="barbsDB",storeData)
  623.             console.log("db barbs doesn't exist, get data")
  624.             resolve(mapVillageInfo)
  625.         }else{
  626.             let dateInfo=new Date(JSON.parse(lzw_decode(dataLocalStorage)).dateInfo).getTime()
  627.             let currentDate=new Date().getTime()
  628.             if(currentDate-dateInfo>3600*1000){//if it's older than 1 hour get new data
  629.    
  630.                 let url=window.location.href.split("/game.php")[0]
  631.                 let dataVillage=httpGet(url+"/map/village.txt").split(/\r?\n/);
  632.                 for(let i=0;i<dataVillage.length;i++){
  633.                     let coord=dataVillage[i].split(",")[2]+"|"+dataVillage[i].split(",")[3]
  634.                     let isBarb=( parseInt(dataVillage[i].split(",")[4])==0 )?0:1 // 0 is barb 1 is not barb
  635.                     if(isBarb==0)
  636.                         mapVillageInfo.set(coord,isBarb)
  637.                 }
  638.                 let storeData={
  639.                     mapVillageInfo:Array.from(mapVillageInfo.entries()),
  640.                     dateInfo:new Date().getTime()
  641.                 }
  642.                 storeData=JSON.stringify(storeData)
  643.                 storeData=lzw_encode(storeData)
  644.                 localStorage.setItem(game_data.word="barbsDB",storeData)
  645.                 console.log("db barbs already exist and it's older than 1 hour")
  646.    
  647.                 resolve(mapVillageInfo)
  648.             }
  649.             else{
  650.                 mapVillageInfo=new Map(JSON.parse(lzw_decode(dataLocalStorage)).mapVillageInfo)
  651.                 console.log("db barbs from localStorage")
  652.                 resolve(mapVillageInfo)
  653.             }
  654.         }
  655.         reject("error")
  656.  
  657.  
  658.     })
  659.  
  660. }
  661.  
  662.  
  663. ////////////////////////////////////////////////data compression////////////////////////////////////////////////////////////////////////////
  664.  
  665.  
  666. function lzw_encode (s) {
  667.     if (!s) return s;
  668.     var dict = new Map(); // Use a Map!
  669.     var data = (s + "").split("");
  670.     var out = [];
  671.     var currChar;
  672.     var phrase = data[0];
  673.     var code = 256;
  674.     for (var i = 1; i < data.length; i++) {
  675.         currChar = data[i];
  676.         if (dict.has(phrase + currChar)) {
  677.             phrase += currChar;
  678.         } else {
  679.             out.push (phrase.length > 1 ? dict.get(phrase) : phrase.codePointAt(0));
  680.             dict.set(phrase + currChar, code);
  681.             code++;
  682.             if (code === 0xd800) { code = 0xe000; }
  683.             phrase = currChar;
  684.         }
  685.     }
  686.     out.push (phrase.length > 1 ? dict.get(phrase) : phrase.codePointAt(0));
  687.     for (var i = 0; i < out.length; i++) {
  688.         out[i] = String.fromCodePoint(out[i]);
  689.     }
  690.     //console.log ("LZW MAP SIZE", dict.size, out.slice (-50), out.length, out.join("").length);
  691.     return out.join("");
  692. }
  693. ////////////////////////////////////////////////data decompression////////////////////////////////////////////////////////////////////////////
  694. function lzw_decode (s) {
  695.     var dict = new Map(); // Use a Map!
  696.     var data = Array.from(s + "");
  697.     //var data = (s + "").split("");
  698.     var currChar = data[0];
  699.     var oldPhrase = currChar;
  700.     var out = [currChar];
  701.     var code = 256;
  702.     var phrase;
  703.     for (var i = 1; i < data.length; i++) {
  704.         var currCode = data[i].codePointAt(0);
  705.         if (currCode < 256) {
  706.             phrase = data[i];
  707.         } else {
  708.             phrase = dict.has(currCode) ? dict.get(currCode) : (oldPhrase + currChar);
  709.         }
  710.         out.push(phrase);
  711.         var cp = phrase.codePointAt(0);
  712.         currChar = String.fromCodePoint(cp); //phrase.charAt(0);
  713.         dict.set(code, oldPhrase + currChar);
  714.         code++;
  715.         if (code === 0xd800) { code = 0xe000; }
  716.         oldPhrase = phrase;
  717.     }
  718.     return out.join("");
  719. }
  720.  
  721. function calcDistance(coord1,coord2){
  722.     let x1=parseInt(coord1.split("|")[0])
  723.     let y1=parseInt(coord1.split("|")[1])
  724.     let x2=parseInt(coord2.split("|")[0])
  725.     let y2=parseInt(coord2.split("|")[1])
  726.  
  727.     return Math.sqrt( (x1-x2)*(x1-x2) +  (y1-y2)*(y1-y2) );
  728. }
  729. function closeWindow(){
  730.     $("#div_container_view").remove()
  731. }
  732.  
  733.  
  734. function createTableSettings(){
  735.     let html_table=`
  736.     <table id="settings_table"  border="1" style="width: 60%;background-color:${backgroundColor};border-color:${borderColor}">
  737.         <tr>
  738.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  739.                 <center><input type="checkbox"  value="downgrade_wall"></center>
  740.             </td>
  741.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  742.                 <div style="margin:10px"><font  color="${titleColor}">downgrade wall</font></div>
  743.             </td>
  744.         </tr>  
  745.         <tr>
  746.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  747.                 <center><input type="checkbox"  value="downgrade_main"></center>
  748.             </td>
  749.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  750.                 <div style="margin:10px"><font  color="${titleColor}">downgrade main</font></div>
  751.             </td>
  752.         </tr>  
  753.         <tr>
  754.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  755.                 <center><input type="checkbox"  value="downgrade_barracks"></center>
  756.             </td>
  757.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  758.                 <div style="margin:10px"><font  color="${titleColor}">downgrade barracks</font></div>
  759.             </td>
  760.         </tr>  
  761.         <tr>
  762.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  763.                 <center><input type="checkbox"  value="downgrade_stable"></center>
  764.             </td>
  765.             <td style="text-align:left; width:auto; background-color:${headerColor}">
  766.                 <div style="margin:10px"><font  color="${titleColor}">downgrade stable</font></div>
  767.             </td>
  768.         </tr>  
  769.         <tr>
  770.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  771.                 <center><input type="checkbox"  value="downgrade_market"></center>
  772.             </td>
  773.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  774.                 <div style="margin:10px"><font  color="${titleColor}">downgrade market</font></div>
  775.             </td>
  776.         </tr>  
  777.         <tr>
  778.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  779.                 <center><input type="checkbox"  value="escort_cats"></center>
  780.             </td>
  781.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  782.                 <div style="margin:10px"><font  color="${titleColor}">cats has escort</font></div>
  783.             </td>
  784.         </tr>  
  785.         <tr>
  786.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  787.                 <div style="margin:10px"><font  color="${titleColor}">folder name</font></div>
  788.             </td>
  789.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  790.                 <center> <input type="text" style="text-align:center;" id="folder_name" placeholder="Loot Assistant" ></center>
  791.             </td>
  792.         </tr>  
  793.         <tr>
  794.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  795.                 <div style="margin:10px"><font  color="${titleColor}">hide old reports(hours)</font></div>
  796.             </td>
  797.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  798.                 <center> <input type="number" style="text-align:center;" id="old_reports" min="0" max="100" placeholder="10" value="10"></center>
  799.             </td>
  800.         </tr>  
  801.         <tr>
  802.             <td style="text-align:left; width:auto; background-color:${headerColor}">
  803.                 <div style="margin:10px"><font  color="${titleColor}">show nr launches</font></div>
  804.             </td>
  805.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  806.                 <center> <input type="number" style="text-align:center;" id="nr_launches" min="0" max="100" placeholder="500" value="500"></center>
  807.             </td>
  808.         </tr>  
  809.         <tr>
  810.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  811.                 <div style="margin:10px"><font  color="${titleColor}">split tabs</font></div>
  812.             </td>
  813.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  814.                 <center> <input type="number" style="text-align:center;" id="nr_split" min="0" max="100" placeholder="20" value="20"></center>
  815.             </td>
  816.         </tr>  
  817.         <tr>
  818.             <td style="text-align:left; width:auto; background-color:${headerColor}">
  819.                 <div style="margin:10px"><font  color="${titleColor}">delay open tabs[ms]</font></div>
  820.             </td>
  821.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  822.                 <center> <input type="number" style="text-align:center;" id="delay_tabs" min="0" max="100" placeholder="200" value="200"></center>
  823.             </td>
  824.         </tr>  
  825.         <tr>
  826.             <td style="text-align:left; width:auto; background-color:${headerColor}">
  827.                 <div style="margin:10px"><font  color="${titleColor}">extra level</font></div>
  828.             </td>
  829.             <td style="text-align:left; width:auto; background-color:${headerColor}" >
  830.                 <center> <input type="number" style="text-align:center;" id="extra_level" min="0" max="100" placeholder="0" value="0"></center>
  831.             </td>
  832.         </tr>  
  833.  
  834.      
  835.  
  836.        
  837.  
  838.     </table>
  839.  
  840.     `
  841.     if(document.getElementById("settings_table")==null){
  842.         document.getElementById("div_settings").innerHTML=html_table
  843.    
  844.  
  845.         document.getElementById("delay_tabs").addEventListener("mouseout",()=>{
  846.             let  tab_delay=parseInt(document.getElementById("delay_tabs").value)
  847.             tab_delay=(Number.isNaN(tab_delay)==true || tab_delay<200)?200:tab_delay
  848.             document.getElementById("delay_tabs").value=tab_delay
  849.         })
  850.  
  851.    
  852.         if(localStorage.getItem(game_data.world+"shaper_settings_table")!=null ){
  853.             //initialize checkbox
  854.             let list_checkbox=JSON.parse(localStorage.getItem(game_data.world+"shaper_settings_table"))[0]
  855.             $('#div_settings input[type=checkbox]').each(function (index,elem) {
  856.                 this.checked=list_checkbox[index]
  857.                 // console.log(elem.value)
  858.             });
  859.  
  860.             //initialize input numbers
  861.             let list_input=JSON.parse(localStorage.getItem(game_data.world+"shaper_settings_table"))[1]
  862.             $('#div_settings input[type=number], input[type=text]').each(function (index,elem) {
  863.                 // console.log(elem)
  864.                 this.value=list_input[index]
  865.             });
  866.         }
  867.    
  868.    
  869.    
  870.         //save settings
  871.         $("#div_settings input[type=number],input[type=text], #div_settings input[type=checkbox]").on("click input",()=>{
  872.             console.log("save settings")
  873.             let list_checkbox=[]
  874.             let list_input=[]
  875.             //save checkbox
  876.             $('#div_settings input[type=checkbox]').each(function () {
  877.                 var checked = this.checked
  878.                 list_checkbox.push(checked)
  879.             });
  880.             //save inputs
  881.             $('#div_settings input[type=number],input[type=text]').each(function () {
  882.                 // var checked = this.checked
  883.                 var value=this.value
  884.                 // console.log(value)
  885.                 list_input.push(value)
  886.             });
  887.             let list_final=[list_checkbox,list_input]
  888.             let data=JSON.stringify(list_final)
  889.             let data_localStorage=localStorage.getItem(game_data.world+"shaper_settings_table")
  890.             console.log(data)
  891.             console.log(data_localStorage)
  892.             if(data!=data_localStorage){
  893.  
  894.                 localStorage.setItem(game_data.world+"shaper_settings_table",data)
  895.             }
  896.    
  897.         })
  898.  
  899.  
  900.  
  901.  
  902.     }
  903.     else{
  904.         $("#div_import").hide()
  905.         $("#div_export").hide()
  906.         $("#div_settings").toggle(500)
  907.     }
  908.      
  909. }
  910.  
  911.  
  912. function createButtons(list_href,parent){
  913.     var  nrSplit=parseInt(document.getElementById("nr_split").value)
  914.     nrSplit=(Number.isNaN(nrSplit)==true || nrSplit==0)?5:nrSplit
  915.  
  916.     list_href=list_href.reverse()
  917.     let nr_buttons=Math.ceil(list_href.length/nrSplit)
  918.     let delayTab=parseInt(document.getElementById("delay_tabs").value)
  919.  
  920.     for(let i=0;i<nr_buttons;i++){
  921.         // console.log("createButton")
  922.         let startFrom=i*nrSplit;
  923.         let stopTo=(i*nrSplit)+nrSplit
  924.         if((i*nrSplit)+nrSplit>list_href.length)
  925.             stopTo=list_href.length
  926.  
  927.         let btn=document.createElement("button")
  928.         btn.classList="btn evt-confirm-btn btn-confirm-yes open_tab"
  929.         btn.innerText="[ "+startFrom+" - "+stopTo+" ]";
  930.         btn.style.margin="5px"
  931.         btn.onclick=function(){
  932.             let current_hrefs= list_href.slice(startFrom,stopTo)
  933.             // console.log(current_hrefs)
  934.             // console.log(btn)
  935.             btn.classList.remove("evt-confirm-btn")
  936.             btn.classList.remove("btn-confirm-yes")
  937.             btn.classList.add("btn-confirm-no")
  938.            
  939.             function startOpen(split_list_href){
  940.                 let url=split_list_href.pop();
  941.                 if(url!=undefined){
  942.                     window.open(url, '_blank')
  943.            
  944.                     window.setTimeout(()=>{
  945.                         startOpen(split_list_href)
  946.                         console.log(url)
  947.                     },delayTab)
  948.                    
  949.  
  950.                 }
  951.             }
  952.             startOpen(current_hrefs)
  953.  
  954.            
  955.             $(".open_tab").prop('disabled', true)
  956.             window.setTimeout(()=>{
  957.                 $(".open_tab").prop('disabled', false)
  958.             },delayTab*(stopTo-startFrom))
  959.  
  960.  
  961.         }
  962.         document.getElementById(parent).appendChild(btn)
  963.        
  964.     }
  965. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement