Cherry Blossom

LOCALE: pt-br , en-us . Script para o game: Bloble Online. Versão beta

// ==UserScript==
// @name         Cherry Blossom
// @namespace    http://bloble.io/*
// @version      0.1
// @description  LOCALE: pt-br , en-us . Script para o game: Bloble Online. Versão beta
// @author       PlayerCB
// @license MIT
// @match        http://bloble.io/*
// @icon         https://github.com/PlayerCB-000/img/blob/main/images.jpg?raw=true
// @connect localhost
// ==/UserScript==



window.onbeforeunload=function(a){}

window.onload = function(){
twttr = undefined;
adsbygoogle = undefined;
}

//VERIFICA STATUS DA CONEXÃO
const xhr = new XMLHttpRequest();
const href = window.location.href;
const linkGame = `http://bloble.io/`;

xhr.open('GET', href);

xhr.onprogress = function () {
if(xhr.status == 404) window.location.assign(linkGame,linkGame);
if(xhr.status !== 200) window.location.assign(href,href);
};

xhr.onload = function () {
console.log(`STATUS: ${xhr.status}`);
if(xhr.status == 404) window.location.assign(linkGame,linkGame);
if(xhr.status !== 200) window.location.assign(href,href);
};

xhr.send();



//VARIAVEIS
window.selBaseSpawn = {load:false,padrao:true,outra:false}
let placar = [];
let onOffFKA = "off"
let onOffDef = "off";
let onOffLag = "off";
let onOffFPB = "off";
let onOffBot = "on"
let TecPonto = false;
let onOffjointroop = "on";
let onOffantkick = "on";
let onOffPower = "off";
const host = "http://localhost:8080";
const heightPag = window.screen.height;
const widthPag = window.screen.width;
const tempoTransicao = 1.5;
window.sockets = [];
window.idBot = 0;
window.teclas = JSON.parse(localStorage.getItem("teclas"))

//PEGA TECLAS PADRÕES
let ArrTeclas = {
    zoomMin:       {  keyCode:73, id:0},
    zoomMax:       {  keyCode:79, id:1},
    resetaVerybase:{  keyCode:84, id:2},
    lag:           {  keyCode:86, id:3},
    def:           {  keyCode:67, id:4},
    tiraInterno:   {  keyCode:88, id:5},
    fullatk:       {  keyCode:90, id:6},
    joinTroop:     {  keyCode:66, id:7},
    JuntaTropa:    {  keyCode:80, id:8},
    selCommander:  {  keyCode:69, id:9},
    selSoldier:    {  keyCode:81, id:10},
    selAll:        {  keyCode:70, id:11},
    upgrade:       {  keyCode:16, id:12},
    speedCam:      {  keyCode:190,id:13}
}

//VERIFICA SE TEM UM PADRAO DE TECLAS PERSONALIZADAS SALVAS
if(window.teclas == undefined || Object.keys(window.teclas).length<14){
    window.teclas = ArrTeclas;
    localStorage.setItem("teclas",JSON.stringify(ArrTeclas));
    console.log("setado no localStorage")
}


//ANTES DA PAGINA SER TOTALMENTE CARREGADA
async function preLoad(){
mainCanvas.focus()

let nome = document.getElementsByTagName("title")
    nome[0].innerText = "Kishi no Meiyo"

//ABRIR VARIAS GUIAS DO JOGO NO NAVEGADOR
cid = UTILS.getUniqueID();
localStorage.setItem("cid",cid);

document.body.style = `
    pointer-events: none;
    cursor: default;
    `
let suportLoading = document.createElement("div")
suportLoading.id = "suportLoading"
suportLoading.innerHTML = `CARREGANDO... aguarde<style>
div#suportLoading{
    width: 100%;
    font-size: 30px;
    font-family: fantasy;
    align-items: center;
    position: absolute;
    z-index: 10000;
    text-align: center;
    color: #b90000;
    height: 100%;
    }
    </style>`

let img = document.createElement("img")
img.id = "loading";
img.src = "https://github.com/PlayerX-000/img/blob/main/loading-29.gif?raw=true";
img.innerHTML = `<style>
img#loading {
    width: 15%;
    height: auto;
    left: 42%;
    top: 42%;
    z-index: 9999;
    position: fixed;
}
</style>`

suportLoading.appendChild(img)
document.body.appendChild(suportLoading)

return addCSS()
}

//FUNÇÕES NATIVAS DO GAME



//MENU DA BASE
function unlockSkins(){skinInfo.style.display="inline-block";skinSelector.style.display="inline-block";unlockedSkins=!0;hasStorage&&localStorage.setItem("isFollBlob",1)}
unlockSkins()


//VERIFICA SE UM BOTAO DE UPGRADE DO JOGADOR OU OUTROS USERS FOI PRESSIONADO (EX: BOTAO DE SALVAR E CARREGAR)
function handleActiveBaseUpgrade(sid,IDUpgrade) {
         if (IDUpgrade == 1){
            //compra commander
                            }
    else if (IDUpgrade == 2){
        let nome = prompt("Insira um nome para salvar  a base")
         saveBase(sid,nome)
                            }
    else if (IDUpgrade == 3){
          let nome = prompt("Insira o nome de uma base, para poder carregar")
         loadBase(nome)
                            }
}

//SALVA A BASE
function saveBase(sid,nome='base1'){
  const user = users[getUserBySID(sid)];
    window.bases=[]
  units.forEach((unit)=>{
  if(unit.owner===user.sid && unit.type!=1){
    let    dir = UTILS.getDirection(unit.x,unit.y,user.x,user.y);
    let    dst = UTILS.getDistance(user.x,user.y,unit.x,unit.y);
    let    uPath = unit.uPath;

      window.bases.push({dir:dir,dst:dst,uPath:uPath,nome:nome})
  }
  })
    localStorage.setItem(nome,JSON.stringify(window.bases))

}


//ZOOM COM SCROLL(GRADATIVO)

let scroll = 0;

mainCanvas.addEventListener ? (window.addEventListener("mousewheel", zoom, !1),
    mainCanvas.addEventListener("DOMMouseScroll", zoom, !1)) : window.attachEvent("onmousewheel", zoom);

function zoom(a) {
    a = window.event || a;
    a.stopPropagation();
    scroll = Math.max(-1, Math.min(1, a.wheelDelta || -a.detail))
    if (scroll == -1) { //zoom out
        if(maxScreenHeight<60000){
      maxScreenWidth += 300
      maxScreenHeight += 300
      resize(true)
        scroll = 0
        }
    }

    if (scroll == 1) { //zoom in
        if(maxScreenHeight>=170){
      maxScreenHeight -= 1
      resize(true)
        scroll = 0
        }
        if(maxScreenWidth >= 1010){
         maxScreenWidth -= 1
      resize(true)
        scroll = 0
        }
    }
}

//TECLA PARA ZOOM
window.addEventListener('keyup', function(a) {
    a = a.keyCode ? a.keyCode : a.which;
       if (document.activeElement == mainCanvas) {
    if (a == window.teclas.zoomMax.keyCode) { // tecla 'o' to  out
        (maxScreenHeight = 30000, maxScreenWidth = 53333, resize(true));
        cameraSpd = (TecPonto==true ? 4.8 : .85) * (Math.log(maxScreenHeight / 1080) + 1)

    }
    if (a == window.teclas.zoomMin.keyCode) { // tecla 'i' to zoom in
        (maxScreenHeight = 170, maxScreenWidth = 1010, resize(true))
        cameraSpd = TecPonto==true ? 4.8 : .85;

    }

       }
})


//CARREGA BASE SALVA
function loadBase(nome='base1'){
    selBaseSpawn.padrao = false;
    selBaseSpawn.load = true;

let base = JSON.parse(localStorage.getItem(nome))
 window.bases = base
 popUpGenerico(`Base carregada !!!
Nome: ${bases[0].nome}
`,true,2000)
}

function fazBaseCarregada(){
for(let a=0;a<bases.length;a++){
socket.emit("1",bases[a].dir,bases[a].dst,bases[a].uPath[0])
}
}
//UPGRADE DE UNIDADES
upgradeUnit=function(a){socket&&gameState&&(1==selUnits.length?socket.emit("4",selUnits[0].id,a):(activeBase)?(a==0&&activeBase.sid==player.sid?(socket.emit("4",0,a,1)):(handleActiveBaseUpgrade(activeBase.sid,activeBase.upgrades[a].id))):(upgradeSelUnits(selUnits[0],a)))
 for (var i = 0; i < window.sockets.length; i++) { sockets[i] && gameState && (1 == selUnits.length ? sockets[i].sock.emit("4", selUnits[0].id, a) : activeBase && activeBase.sid == player.sid && sockets[i].sock.emit("4", 0, a, 1)); }
                       }

//MOSTRA INFO DAS UNITS
toggleUnitInfo=function(a,d){var c="";a&&a.uPath&&(c=void 0!=a.group?a.group:a.uPath[0],c=unitList[c].limit?(unitList[c].count||0)+"/"+unitList[c].limit:"");if(a&&(forceUnitInfoUpdate||"block"!=unitInfoContainer.style.display||unitInfoName.innerHTML!=(a.iName||a.name)||lastCount!=c)){forceUnitInfoUpdate=!1;unitInfoContainer.style.display="block";unitInfoName.innerHTML=a.iName||a.name;a.cost?(unitInfoCost.innerHTML="Cost "+a.cost,unitInfoCost.style.display="block"):unitInfoCost.style.display="none";
unitInfoDesc.innerHTML=a.desc;unitInfoType.innerHTML=a.typeName;var b=a.space;lastCount=c;c='<span style="color:#fff">'+c+"</span>";unitInfoLimit.innerHTML=b?'<span><i class="material-icons" style="vertical-align: top; font-size: 20px;">&#xE7FD;</i>'+b+"</span> "+c:c;unitInfoUpgrades.innerHTML="";if(d&&a.upgrades){for(var g,e,h,f,k,c=0;c<a.upgrades.length;++c)(function(b){g=a.upgrades[b];var c=!0;g.lockMaxBuy&&void 0!=g.unitSpawn&&(unitList[g.unitSpawn].count||0)>=(unitList[g.unitSpawn].limit||0)?
c=!1:g.dontShow&&(c=!1);c&&(e=document.createElement("div"),e.className="upgradeInfo",h=document.createElement("div"),h.className="unitInfoName",h.innerHTML=g.name,e.appendChild(h),f=document.createElement("div"),f.className="unitInfoCost",g.cost?(f.innerHTML="Cost "+g.cost,e.appendChild(f)):(null),k=document.createElement("div"),k.id="upgrDesc"+b,k.className="unitInfoDesc",k.innerHTML=g.desc,k.style.display="none",e.appendChild(k),e.onmouseover=function(){document.getElementById("upgrDesc"+b).style.display="block"},
e.onmouseout=function(){document.getElementById("upgrDesc"+b).style.display="none"},e.onclick=function(){upgradeUnit(b);mainCanvas.focus()},unitInfoUpgrades.appendChild(e))})(c);g=e=h=f=k=null}}else a||(unitInfoContainer.style.display="none")}


//FUNÇÕES CONSTRUTORAS


//VENDE UNITS SELECIONADAS
sellSelUnits=function(){ //Vende todas os objetos selecionados para bots
    if (selUnits.length) {
        for (var a = [], d = 0; d < selUnits.length; ++d)
            a.push(selUnits[d].id);
        socket.emit("3", a);

        for (var i = 0; i < window.sockets.length; i++) { window.sockets[i].sock.emit("3", a); }
    }

};


//UPA TODAS AS UNITS SELECIONADAS
function upgradeSelUnits(firstUnit,upgrade){ //UPA todas os objetos selecionados para bots
    var firstUnitName = getUnitFromPath(firstUnit.uPath).name
    for(var i=0;i<selUnits.length;i++){
        var unit = selUnits[i]
        if(getUnitFromPath(unit.uPath).name==firstUnitName){
            socket.emit("4",unit.id,upgrade)
            if(window.sockets.length>0){
            window.sockets.forEach((sk)=>{
            let socket = sk.sock
            socket.emit("4",unit.id,upgrade)
            })
            }
        }
    }
}




//SELECT COMMANDER BOTS
toggleSelUnit = function(){
    if (player && !activeUnit && units) {
        var a = (player.x || 0) - maxScreenWidth / 2 + camX,
            d = (player.y || 0) - maxScreenHeight / 2 + camY,
            c = player.x - a + targetDst * MathCOS(targetDir) + camX,
            b = player.y - d + targetDst * MathSIN(targetDir) + camY;
        disableSelUnit();
        var g = 4 >= MathABS(c - mouseStartX + (b - mouseStartY)),
            e = !1;
        activeBase = null;
        if (g)
            for (var h = 0; h < users.length; ++h)
                if (0 <= users[h].size - UTILS.getDistance(c, b, users[h].x - a, users[h].y - d)) {
                    activeBase = users[h];
                    forceUnitInfoUpdate = !0;
                    break
                }
        if (!activeBase) {
            activeBase = null;
            for (h = 0; h < units.length; ++h)
                if (users[getUserBySID(units[h].owner)] !== undefined && users[getUserBySID(units[h].owner)].name.startsWith(player.name) === true || units[h].owner == player.sid)
                    if (g) {
                        if (0 <= units[h].size - UTILS.getDistance(c, b, units[h].x - a, units[h].y - d)) {
                            selUnits.push(units[h]);
                            var f = getUnitFromPath(selUnits[0].uPath);
                            f && (selUnits[0].info = f, "Unit" == f.typeName && (e = !0));
                            break
                        }
                    } else UTILS.pointInRect(units[h].x - a, units[h].y - d, mouseStartX, mouseStartY, c - mouseStartX, b - mouseStartY) && (selUnits.push(units[h]), f = getUnitFromPath(selUnits[selUnits.length - 1].uPath)) && (selUnits[selUnits.length - 1].info = f, "Unit" == f.typeName && (e = !0));
            if (selUnits.length) {
                for (h = selUnits.length - 1; 0 <= h; --h) e && "Tower" == selUnits[h].info.typeName ? selUnits.splice(h, 1) : e || "Unit" != selUnits[h].info.typeName || selUnits.splice(h, 1);
                selUnitType = e ? "Unit" : "Tower";
                150 < selUnits.length && (selUnits.length = 150)
            }
        }
        updateSelUnitViews()
    }
}

//BOTAO VENDE
updateSelUnitViews=function() {
sellButton.style.display = "block";
for (var a = 0, d = 0; d < selUnits.length; ++d)
a += Math.round(selUnits[d].info.cost / 2);
a ? sellButton.innerHTML = "Sell <span class='spanLink'>" + a + "</span>" : sellButton.style.display = "none"
}



//ESPELHADO
sendUnit = function(a) {
    socket && gameState && activeUnit && !activeUnit.dontPlace && socket.emit("1", UTILS.roundToTwo(activeUnitDir), UTILS.roundToTwo(activeUnitDst), a);
    for (var i = 0; i < window.sockets.length; i++) { sockets[i].sock.emit("1", UTILS.roundToTwo(activeUnitDir), UTILS.roundToTwo(activeUnitDst), a); }
}


/*UPGRADE ESPELHADO
upgradeUnit = function(a) {
    socket && gameState && (1 == selUnits.length ? socket.emit("4", selUnits[0].id, a) : (activeBase) ? (a == 0 && activeBase.sid == player.sid ? (socket.emit("4", 0, a, 1)) : (handleActiveBaseUpgrade(activeBase.sid, activeBase.upgrades[a].name))) : (upgradeSelUnits(selUnits[0], a)))
    for (var i = 0; i < window.sockets.length; i++) { sockets[i] && gameState && (1 == selUnits.length ? sockets[i].emit("4", selUnits[0].id, a) : activeBase && activeBase.sid == player.sid && sockets[i].emit("4", 0, a, 1)); }
}
*/




//----------------------ARBUSTO INVISIVEL------------------------------------------------//


renderUnit = function(a, d, c, b, g, e, k) { //POR MIM (PlayerX)
    g="rgb(43 69 193 / 33%)"
            var f = b.size * (k ? iconSizeMult : 1),
                h = f + ":" + b.cloak + ":" + b.renderIndex + ":" + b.iSize + ":" + b.turretIndex + ":" + b.shape + ":" + g;
            if (!unitSprites[h]) {
                var m = document.createElement("canvas"),
                    l = m.getContext("2d");
                m.width = 2 * f + 30;
                m.height = m.width;
                m.style.width = m.width + "px";
                m.style.height = m.height + "px";
                l.translate(m.width / 2, m.height / 2);
                l.lineWidth = 2
                l.strokeStyle = "black";
                l.fillStyle = g;
                4 == b.renderIndex ? l.fillStyle = "rgb(0 6 72 / 84%)" : 5 == b.renderIndex && (l.fillStyle = "rgb(255 255 255 / 0%)",
                    renderRect(0, .76 * f, 1.3 * f, f / 2.4, l), l.fillStyle = g);
                b.cloak && (l.fillStyle = "rgb(255 255 255 / 0%)");
                "circle" == b.shape ? (renderCircle(0, 0, f, l), b.iSize && (l.fillStyle = "rgb(255 255 255 / 0%)", renderCircle(0, 0, f * b.iSize, l))) :
                    "triangle" == b.shape ? (renderTriangle(0, 0, f, l), b.iSize && (l.fillStyle = "rgb(255 255 255 / 0%)", renderTriangle(0, 2, f * b.iSize, l))) : "hexagon" == b.shape ? (renderAgon(0, 0, f, l, 6), b.iSize && (l.fillStyle = "rgb(255 255 255 / 0%)", renderAgon(0, 0, f * b.iSize, l, 6))) :
                    "octagon" == b.shape ? (l.rotate(MathPI / 8), renderAgon(0, 0, .96 * f, l, 8), b.iSize && (l.fillStyle = "rgb(255 255 255 / 0%)", renderAgon(0, 0, .96 * f * b.iSize, l, 8))) : "pentagon" == b.shape ? (l.rotate(-MathPI / 2), renderAgon(0, 0, 1.065 * f, l, 5), b.iSize && (l.fillStyle = "rgb(255 255 255 / 0%)", renderAgon(0, 0, 1.065 * f * b.iSize, l, 5))) :
                    "square" == b.shape ? (renderSquare(0, 0, f, l), b.iSize && (l.fillStyle = "rgb(255 255 255 / 0%)", renderSquare(0, 0, f * b.iSize, l))) : "spike" == b.shape ? renderStar(0, 0, f, .7 * f, l, 8) : "star" == b.shape && (f *= 1.2, renderStar(0, 0, f, .7 * f, l, 6));
                if (1 == b.renderIndex) l.fillStyle = "rgb(255 255 255 / 0%)", renderRect(f / 2.8, 0, f / 4, f / 1, l), renderRect(-f / 2.8, 0, f / 4, f / 1, l);
                else if (2 == b.renderIndex) l.fillStyle = "rgb(255 255 255 / 0%)", renderRect(f / 2.5, f / 2.5, f / 2.5, f / 2.5, l), renderRect(-f / 2.5, f / 2.5, f / 2.5, f / 2.5, l), renderRect(f / 2.5, -f / 2.5, f / 2.5, f / 2.5, l), renderRect(-f / 2.5, -f / 2.5, f / 2.5, f / 2.5, l);
                else if (3 == b.renderIndex) l.fillStyle = "rgb(255 255 255 / 0%)", l.rotate(MathPI / 2), renderRectCircle(0, 0, .75 * f, f / 2.85, 3, l), renderCircle(0, 0, .5 * f, l), l.fillStyle = "rgb(255 255 255 / 0%)";
                else if (6 == b.renderIndex) l.fillStyle = "rgb(255 255 255 / 0%)", l.rotate(MathPI / 2), renderRectCircle(0, 0, .7 * f, f / 4, 5, l), l.rotate(-MathPI / 2), renderAgon(0, 0, .4 * f, l, 6);
                else if (7 == b.renderIndex)
                    for (g = 0; 3 > g; ++g) l.fillStyle ="rgb(255 255 255 / 0%)" ? 1 == g ? "transparent" : "transparent" : "transparent", renderStar(0, 0, f, .7 * f, l, 7), f *= .55;
                else 8 == b.renderIndex && (l.fillStyle = "rgb(255 255 255 / 0%)", renderRectCircle(0, 0, .75 * f, f / 2.85, 3, l), renderSquare(0, 0, .5 * f, l));
                1 != b.type && b.turretIndex && renderTurret(0, 0, b.turretIndex, k ? iconSizeMult : 1, -(MathPI / 2), l);
                unitSprites[h] = m
            }
            f = unitSprites[h];
            e.save();
            e.translate(a, d);
            e.rotate(c + MathPI / 2);
            e.drawImage(f, -(f.width / 2), -(f.height / 2), f.width, f.height);
            1 == b.type && b.turretIndex && renderTurret(0, 0, b.turretIndex, k ? iconSizeMult : 1, b.turRot - MathPI / 2 - c, e);
            e.restore()
        }

//------------------------------DESENHA AS LINHAS DA BASE----------------------------------------//

 renderDottedCircle=function(a, d, c, b) {
            b.setLineDash([0, 0]); b.beginPath(); b.arc(a, d, c + b.lineWidth / 2, 0, 2 * Math.PI); b.stroke(); b.setLineDash([]) }
 renderDottedLine=function(a, d, c, b, g) {
            g.setLineDash([0, 0]); g.beginPath(); g.moveTo(a, d); g.lineTo(c, b); g.stroke(); g.setLineDash([]) }


//---------------------------------------LIGA OS PLAYER(LINHA DO JOGO)---------------------------//
function playersLinked(a, d) {
    if (a.sid == player.sid && d.name.startsWith(player.name)) {
        return true;
    }
}


//----------------------------------RENDERIZA BASE------------------------------------------------//


   window.renderPlayer = function(a, d, c, b, g) {

   b.save();
   if (a.skin && 0 < a.skin && a.skin <= playerSkins && !skinSprites[a.skin]) {
   var e = new Image;
   e.onload = function() {
   this.readyToDraw = !0;
   this.onload = null;
   g == currentSkin && changeSkin(0);
};
   e.src = ".././img/skins/skin_" + (a.skin - 1) + ".png";
   skinSprites[a.skin] = e;
}
  a.skin && skinSprites[a.skin] && skinSprites[a.skin].readyToDraw ? (e = a.size - b.lineWidth / 4, b.lineWidth /= 2, renderCircle(d, c, a.size, b, !1, !0)) : g || (b.fillStyle = "rgb(255 255 255 / 0%)", renderCircle(d, c, a.size, b));
  b.restore();
   }

//-----------------------------LOOP DO GAME-----------------------------------------//

updateGameLoop=function(a){if(player&&gameData){updateTarget();if(gameState&&mapBounds){if(camXS||camYS)camX+=camXS*cameraSpd*a,camY+=camYS*cameraSpd*a;player.x+camX<mapBounds[0]?camX=mapBounds[0]-player.x:player.x+camX>mapBounds[0]+mapBounds[2]&&(camX=mapBounds[0]+mapBounds[2]-player.x);player.y+camY<mapBounds[1]?camY=mapBounds[1]-player.y:player.y+camY>mapBounds[1]+mapBounds[3]&&(camY=mapBounds[1]+mapBounds[3]-player.y);
currentTime-lastCamSend>=sendFrequency&&(lastCamX!=camX||lastCamY!=camY)&&(lastCamX=camX,lastCamY=camY,lastCamSend=currentTime,socket.emit("2",Math.round(camX),Math.round(camY)))}renderBackground(outerColor);var d=(player.x||0)-maxScreenWidth/2+camX,c=(player.y||0)-maxScreenHeight/2+camY;mapBounds&&(mainContext.fillStyle=backgroundColor,mainContext.fillRect(mapBounds[0]-d,mapBounds[1]-c,mapBounds[2],mapBounds[3]));for(var b,g,e=0;e<units.length;++e)b=units[e],b.interpDst&&(g=b.interpDst*a*.015,b.interX+=
g*MathCOS(b.interpDir),b.interY+=g*MathSIN(b.interpDir),b.interpDst-=g,.1>=b.interpDst&&(b.interpDst=0,b.interX=b.interpDstS*MathCOS(b.interpDir),b.interY=b.interpDstS*MathSIN(b.interpDir))),b.speed&&(updateUnitPosition(b),b.x+=b.interX||0,b.y+=b.interY||0);var h,f;if(gameState)if(activeUnit){h=player.x-d+targetDst*MathCOS(targetDir)+camX;f=player.y-c+targetDst*MathSIN(targetDir)+camY;var k=UTILS.getDirection(h,f,player.x-d,player.y-c);0==activeUnit.type?(b=UTILS.getDistance(h,f,player.x-d,player.y-
c),b-activeUnit.size<player.startSize?(h=player.x-d+(activeUnit.size+player.startSize)*MathCOS(k),f=player.y-c+(activeUnit.size+player.startSize)*MathSIN(k)):b+activeUnit.size>player.buildRange-.15&&(h=player.x-d+(player.buildRange-activeUnit.size-.15)*MathCOS(k),f=player.y-c+(player.buildRange-activeUnit.size-.15)*MathSIN(k))):1==activeUnit.type||2==activeUnit.type?(h=player.x-d+(activeUnit.size+player.buildRange)*MathCOS(k),f=player.y-c+(activeUnit.size+player.buildRange)*MathSIN(k)):3==activeUnit.type&&
(b=UTILS.getDistance(h,f,player.x-d,player.y-c),b-activeUnit.size<player.startSize?(h=player.x-d+(activeUnit.size+player.startSize)*MathCOS(k),f=player.y-c+(activeUnit.size+player.startSize)*MathSIN(k)):b+activeUnit.size>player.buildRange+2*activeUnit.size&&(h=player.x-d+(player.buildRange+activeUnit.size)*MathCOS(k),f=player.y-c+(player.buildRange+activeUnit.size)*MathSIN(k)));activeUnitDir=k;activeUnitDst=UTILS.getDistance(h,f,player.x-d,player.y-c);activeUnit.dontPlace=!1;mainContext.fillStyle=
outerColor;if(0==activeUnit.type||2==activeUnit.type||3==activeUnit.type)for(e=0;e<units.length;++e)if(1!=units[e].type&&units[e].owner==player.sid&&0<=activeUnit.size+units[e].size-UTILS.getDistance(h,f,units[e].x-d,units[e].y-c)){mainContext.fillStyle=redColor;activeUnit.dontPlace=!0;break}renderCircle(h,f,activeUnit.range?activeUnit.range:activeUnit.size+30,mainContext,!0)}else if(selUnits.length)for(e=0;e<selUnits.length;++e)mainContext.fillStyle=outerColor,1<selUnits.length?renderCircle(selUnits[e].x-
d,selUnits[e].y-c,selUnits[e].size+25,mainContext,!0):renderCircle(selUnits[e].x-d,selUnits[e].y-c,selUnits[e].range?selUnits[e].range:selUnits[e].size+25,mainContext,!0);else activeBase&&(mainContext.fillStyle=outerColor,renderCircle(activeBase.x-d,activeBase.y-c,activeBase.size+50,mainContext,!0));if(selUnits.length)for(mainContext.strokeStyle=targetColor,e=0;e<selUnits.length;++e)selUnits[e].gatherPoint&&renderDottedCircle(selUnits[e].gatherPoint[0]-d,selUnits[e].gatherPoint[1]-c,30,mainContext);
for(e=0;e<users.length;++e)if(b=users[e],!b.dead){mainContext.lineWidth=1.2*outlineWidth;mainContext.strokeStyle=indicatorColor;isOnScreen(b.x-d,b.y-c,b.buildRange)&&(mainContext.save(),mainContext.translate(b.x-d,b.y-c),renderDottedCircle(0,0,b.buildRange,mainContext),renderDottedCircle(0,0,b.startSize,mainContext),mainContext.restore());b.spawnProt&&(mainContext.strokeStyle=redColor,mainContext.save(),mainContext.translate(b.x-d,b.y-c),
renderDottedCircle(0,0,b.buildRange+140,mainContext),mainContext.restore());for(var m=0;m<users.length;++m)e<m&&!users[m].dead&&(mainContext.strokeStyle=b.spawnProt||users[m].spawnProt?redColor:indicatorColor,playersLinked(b,users[m])&&(isOnScreen(b.x-d,b.y-c,0)||isOnScreen(users[m].x-d,users[m].y-c,0)||isOnScreen((b.x+users[m].x)/2-d,(b.y+users[m].y)/2-c,0))&&(g=UTILS.getDirection(b.x,b.y,users[m].x,users[m].y),renderDottedLine(b.x-(b.buildRange+lanePad+(b.spawnProt?140:0))*MathCOS(g)-d,b.y-(b.buildRange+
lanePad+(b.spawnProt?140:0))*MathSIN(g)-c,users[m].x+(users[m].buildRange+lanePad+(users[m].spawnProt?140:0))*MathCOS(g)-d,users[m].y+(users[m].buildRange+lanePad+(users[m].spawnProt?140:0))*MathSIN(g)-c,mainContext)))}mainContext.strokeStyle=darkColor;mainContext.lineWidth=1.2*outlineWidth;for(e=0;e<units.length;++e)b=units[e],b.layer||(b.onScreen=!1,isOnScreen(b.x-d,b.y-c,b.size)&&(b.onScreen=!0,renderUnit(b.x-d,b.y-c,b.dir,b,playerColors[b.color],mainContext)));for(e=0;e<units.length;++e)b=units[e],
1==b.layer&&(b.onScreen=!1,isOnScreen(b.x-d,b.y-c,b.size)&&(b.onScreen=!0,renderUnit(b.x-d,b.y-c,b.dir,b,playerColors[b.color],mainContext)));mainContext.fillStyle=bulletColor;for(e=bullets.length-1;0<=e;--e){b=bullets[e];if(b.speed&&(b.x+=b.speed*a*MathCOS(b.dir),b.y+=b.speed*a*MathSIN(b.dir),UTILS.getDistance(b.sX,b.sY,b.x,b.y)>=b.range)){bullets.splice(e,1);continue}isOnScreen(b.x-d,b.y-c,b.size)&&renderCircle(b.x-d,b.y-c,b.size,mainContext)}mainContext.strokeStyle=darkColor;mainContext.lineWidth=
1.2*outlineWidth;for(e=0;e<users.length;++e)b=users[e],!b.dead&&isOnScreen(b.x-d,b.y-c,b.size)&&(renderPlayer(b,b.x-d,b.y-c,mainContext),"unknown"!=b.name&&(tmpIndx=b.name+"-"+b.size,20<=b.size&&b.nameSpriteIndx!=tmpIndx&&(b.nameSpriteIndx=tmpIndx,b.nameSprite=renderText(b.name,b.size/4)),b.nameSprite&&mainContext.drawImage(b.nameSprite,b.x-d-b.nameSprite.width/2,b.y-c-b.nameSprite.height/2,b.nameSprite.width,b.nameSprite.height)));if(selUnits.length)for(e=selUnits.length-1;0<=e;--e)selUnits[e]&&
0>units.indexOf(selUnits[e])&&disableSelUnit(e);activeUnit&&renderUnit(h,f,k,activeUnit,playerColors[player.color],mainContext);showSelector&&(mainContext.fillStyle="rgba(255, 255, 255, 0.1)",h=player.x-d+targetDst*MathCOS(targetDir)+camX,f=player.y-c+targetDst*MathSIN(targetDir)+camY,mainContext.fillRect(mouseStartX,mouseStartY,h-mouseStartX,f-mouseStartY));playerBorderRot+=a/5600;hoverUnit?toggleUnitInfo(hoverUnit):activeBase?toggleUnitInfo(activeBase,true):activeUnit?toggleUnitInfo(activeUnit):
0<selUnits.length?toggleUnitInfo(selUnits[0].info,!0):toggleUnitInfo()}};
renderText=function(a, d) { var c = document.createElement("canvas") , b = c.getContext("2d"); b.font = d + "px regularF"; var g = b.measureText(a); c.width = g.width + 20; c.height = 2 * d; b.translate(c.width / 2, c.height / 2); b.font = d + "px regularF"; b.fillStyle = "#00e1ff"; b.textBaseline = "middle"; b.textAlign = "center"; b.strokeStyle = '#001044'; b.lineWidth = outlineWidth; b.strokeText(a, 0, 0); b.fillText(a, 0, 0); return c }


//ENVIA MENSAGEM LOCAL
window.addChat = function(msg, from, color) {
    color = color || "#fff";
    var b = document.createElement("li");
    b.className = "chatother";
    b.innerHTML = '<span style="color:' + color + '">(' + from + ')</span> <span class="chatText" style="color:black">' + msg + "</span>";
    100 < chatList.childNodes.length && chatList.removeChild(chatList.childNodes[0]);
    chatList.appendChild(b)
}

//RECEBE E FAZ CHAT

window.addChatLine = function(a, mensagem, c) {
    if (player) {
        var b = getUserBySID(a);
        if (c || 0 <= b) {
            var g = c ? "SERVER" : users[b].name;
            c = c ? "#fff" : playerColors[users[b].color] ? playerColors[users[b].color] : playerColors[0];
            player.sid == a && (c = "#fff");
            b = document.createElement("li");
            b.className = player.sid == a ? "chatme" : "chatother";
            b.innerHTML = '<span style="color:' + c + '">_' + g + '_[ID:'+a+']</span> <span class="chatText">' + mensagem + "</span>";
            10 < chatList.childNodes.length && chatList.removeChild(chatList.childNodes[0]);
            chatList.appendChild(b)
        }
    }
    if (a == player.sid && mensagem.startsWith('*')) {
        window.sockets.forEach(socket => {
            socket.sock.emit("ch", mensagem.split('*')[1])
        })
    }
}

//-----------------------------RECEBE OS EVENTOS DO SERVIDOR-----------------------------------------//

setupSocket=function(){
    socket.on("pong",(a)=>{addChat('',`Ping: ${a}`,'#ffffff82')})
socket.on("connect_error",function(){document.location.reload();enterGame()});
    socket.on("disconnect",function(a){document.location.reload();enterGame()});
    socket.on("error",function(a){kickPlayer("Disconnected. The server may have updated.")});
    socket.on("kick",function(a){kickPlayer(a);enterGame()});
    socket.on("lk",function(a){partyKey=a;});
    socket.on("spawn",function(){
        gameState=1;
        unitList=share.getUnitList();
resetCamera();toggleMenuUI(!1);toggleGameUI(!0);updateUnitList();

        player.upgrades =  [{
            id:1,
            name: "Commander",
            desc: "Powerful commander unit",
            lockMaxBuy: true,
            cost: 1500,
            unitSpawn: 9
        },
        {
            id:2,
            name: "Salvar Base",
            desc: "Salvar Base, Para Poder Usar Em Qualquer Hora",
        },
        {
            id:3,
            name: "Carregar Base",
            desc: "Carregue Uma Base Salva Anteriormente",
        }]

        ;;mainCanvas.focus()});
    socket.on("gd",function(a){gameData=a});
    socket.on("mpd",function(a){mapBounds=a});
    socket.on("ch",function(a,d,c){addChatLine(a,d,c)});
    socket.on("setUser",function(a,d){
        if(a&&a[0]){var c=getUserBySID(a[0]),b={sid:a[0],name:a[1],iName:"Headquarters",dead:!1,color:a[2],size:a[3],startSize:a[4],x:a[5],y:a[6],buildRange:a[7],gridIndex:a[8],spawnProt:a[9],skin:a[10],desc:`ID: ${a[0]} <br>
Base do ${a[1]}<br>
`,kills:666,typeName:"by PlayerX",upgrades:[{id:2,name:"Copiar",desc:"Copiar base para poder usar depois"}]};null!=c?(users[c]=b,d&&(player=users[c])):(users.push(b),d&&(player=users[users.length-1]))}

    });
    socket.on("klUser",function(a){var d=getUserBySID(a);null!=d&&(users[d].dead=!0);player&&player.sid==a&&(hideMainMenuText(),leaveGame(),enterGame())});
    socket.on("delUser",function(a){a=getUserBySID(a);null!=a&&users.splice(a,1)});
    socket.on("au",function(a){a&&(units.push({id:a[0],owner:a[1],uPath:a[2]||0,type:a[3]||0,color:a[4]||0,paths:a[5],x:a[6]||0,sX:a[6]||0,y:a[7]||0,sY:a[7]||0,dir:a[8]||
0,turRot:a[8]||0,speed:a[9]||0,renderIndex:a[10]||0,turretIndex:a[11]||0,range:a[12]||0,cloak:a[13]||0}),units[units.length-1].speed&&(units[units.length-1].startTime=window.performance.now()),a=getUnitFromPath(units[units.length-1].uPath))&&(units[units.length-1].size=a.size,units[units.length-1].shape=a.shape,units[units.length-1].layer=a.layer,units[units.length-1].renderIndex||(units[units.length-1].renderIndex=a.renderIndex),units[units.length-1].range||(units[units.length-1].range=a.range),
units[units.length-1].turretIndex||(units[units.length-1].turretIndex=a.turretIndex),units[units.length-1].iSize=a.iSize)});
    socket.on("spa",function(a,d,c,b){a=getUnitById(a);if(null!=a){var g=UTILS.getDistance(d,c,units[a].x||d,units[a].y||c);300>g&&g?(units[a].interpDst=g,units[a].interpDstS=g,units[a].interpDir=UTILS.getDirection(d,c,units[a].x||d,units[a].y||c)):(units[a].interpDst=0,units[a].interpDstS=0,units[a].interpDir=0,units[a].x=d,units[a].y=c);units[a].interX=0;units[a].interY=0;units[a].sX=
units[a].x||d;units[a].sY=units[a].y||c;b[0]&&(units[a].dir=b[0],units[a].turRot=b[0]);units[a].paths=b;units[a].startTime=window.performance.now()}});
    socket.on("uc",function(a,d){unitList&&(unitList[a].count=d);forceUnitInfoUpdate=!0});
    socket.on("uul",function(a,d){unitList&&(unitList[a].limit+=d)});
    socket.on("rpu",function(a,d){var c=getUnitFromPath(a);c&&(c.dontShow=d,forceUnitInfoUpdate=!0)});
    socket.on("sp",function(a,d){var c=getUserBySID(a);null!=c&&(users[c].spawnProt=d)});
    socket.on("ab",function(a){a&&
bullets.push({x:a[0],sX:a[0],y:a[1],sY:a[1],dir:a[2],speed:a[3],size:a[4],range:a[5]})});
    socket.on("uu",function(a,d){if(void 0!=a&&d){var c=getUnitById(a);if(null!=c)for(var b=0;b<d.length;)units[c][d[b]]=d[b+1],"dir"==d[b]&&(units[c].turRot=d[b+1]),b+=2}});
    socket.on("du",function(a){a=getUnitById(a);null!=a&&units.splice(a,1)});
    socket.on("sz",function(a,d){var c=getUserBySID(a);null!=c&&(users[c].size=d)});
    socket.on("pt",function(a){
        window.PowerPlayer = a;
let containerPonto = document.getElementById("statContainer")
let medicao = Math.round(a/60)

        containerPonto.innerHTML=`<div>Jogadores: <span> ${users.length}</span></div>
                                  <div>Lag: <span> ${onOffLag}</span></div>
                                  <div>Join Troop: <span> ${onOffjointroop}</span></div>
                                  <div style='width: 100%; height: auto; display: flex; flex-direction: row; flex-wrap: nowrap; align-content: center; justify-content: center; align-items: center'><div style='width:auto;height:auto'>💲</div> <div style='width:100%;height:15px'><div style='text-align: left; align-items: left;width:${medicao}%;height:100%;background-color:#29cb008f'> ${a}$</div></div></div>
                                  <div style='width: 100%; height: auto; display: flex; flex-direction: row; flex-wrap: nowrap; align-content: center; justify-content: center; align-items: center'><div style='width:auto;height:auto'>❤️</div> <div style='width:100%;height:15px'><div style='text-align: left; align-items: left;width:${player.size}%;height:100%;background-color:#ff000080'> ${player.size}%</div></div></div>
        `

    });


socket.on("l",function(a){
placar = []
for(var d="",c=1,b=0;b<a.length;){
placar.push({posicao:c,nome:a[b+1],pontos:a[b+2],sid:a[b]})
c++,b+=3
if(a==b)break}

layoutGame()
})
}

//----------------------------FUNCAO PARA ENTRAR NO GAME------------------------------------------//

enterGame=function(){
        let aviso = document.getElementById("suportLoading")
        aviso.style.display = "none"
        if(socket&&unitList){
            showMainMenuText(randomLoadingTexts[UTILS.randInt(0, randomLoadingTexts.length - 2)])
                if(hasStorage){
                localStorage.setItem("lstnmdbl",userNameInput.value);
                mainCanvas.focus()
                grecaptcha.execute("6Ldh8e0UAAAAAFOKBv25wQ87F3EKvBzyasSbqxCE").then((a)=>{
                    socket.emit("spawn",{name:"PX "+userNameInput.value,skin:currentSkin},a)
                    }).catch((a)=>{console.log('erro ao executar grecaptcha\n');throw a;})

                }}}

//----------------------------------------------------------------------//

//ADICIONA CSS NA PAGINA
function addCSS(){

    console.log("pré-load: OK")

document.body.style = `
    background-color: #ffffff;
    margin: 0;
    width: 100%;
    height: 100%;
`
    let titulo = document.getElementById("gameTitle"),
    tagLinks = document.getElementById("linksContainer"),
    loading = document.getElementById("loading"),
    linkYT = document.getElementById("linksContainer"),
    todosC = document.getElementById("smallAdContainer"),
    links = document.getElementById("infoLinks"),
    leader = document.getElementById("leaderboardHeader"),
    Clink = document.getElementById("creatorLink"),
    adCont = document.getElementById("adContainer"),
    Darkner = document.getElementById("darkener"),
    enterGbotao = document.getElementById("enterGameButton"),
    inputName = document.getElementById("userNameInput")

    const cor_deFundo = "#5e5e5e87"
    const cor_daFont = "#000000a3"
    const cor_deFundoHome1 = "#5e5e5e87"
    const cor_deFundoHome2 = "#000000a3"
    const corFundoMenu = "#00093473"

//CRIA E ADICIONA O CSS MODIFICADO A PAGINA
const css = document.createElement("style")
css.innerText = `
th, td {
  padding: 8px;
  text-align: left;
  border: 1px solid #000;
}

tr:hover {background-color: #2942b973;}

div::-webkit-scrollbar {
  width: 12px;
}
div::-webkit-scrollbar-track {
  background-color: #001d6e9c;
    border-radius: 10px;
}
div::-webkit-scrollbar-thumb {
  background-color: #000934;
  border-radius: 20px;
  border: 3px solid #0049892b;
}

input[type=number]::-webkit-inner-spin-button {
    -webkit-appearance: none;

}
input[type=number] {
   -moz-appearance: textfield;
   appearance: textfield;

}

#sellButton{
    display: none;
    position: absolute;
    bottom: 18%;
    left: 10px;
    background-color: rgba(40, 40, 40, 0.5);
    border-radius: 4px;
    font-family: 'regularF';
    font-size: 20px;
    color: #fff;
    cursor: pointer;
    padding: 10px;
    pointer-events: all;
}

#statContainer {
    border-top-color: #c30e4059 !important;
    border-color: #862cb957;
    position: absolute;
    border-bottom-color: #c30e4059 !important;
    bottom: 10px;
    width: 20%;
    border-block: initial;
    background-color: #341ead42;
    height: auto;
    border-radius: 10px;
    border-style: solid;
    left: 10px;
    display: flex;
    flex-direction: column;
    flex-wrap: nowrap;
    align-content: center;
    justify-content: center;
    align-items: flex-start;
    }


div#leaderboardContainer > div > div {
    width: 70%;
}

.left {
    width: 50%;
    display: flex;
    justify-content: flex-end;
    flex-direction: row;
    flex-wrap: nowrap;
    align-content: center;
    align-items: center;
}
.right {
    width: 50%;
    display: flex;
    justify-content: flex-start;
    flex-direction: row;
    flex-wrap: nowrap;
    align-content: center;
    align-items: center;
}

div#leaderboardContainer > div > div > button {
    background-color: transparent;
    border: 0;
}

div#leaderboardContainer > div > div > button:hover {
    background-color: transparent;
    border: 0;
    font-size: larger;
}

div#leaderboardContainer > div {
    width: 100%;
    font-size: small;
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    align-content: center;
    justify-content: space-between;
    align-items: center;
}

#leaderboardContainer {
    display: flex;
    overflow-y: auto;
    width: 20%;
    position: absolute;
    top: 10px;
    right: 10px;
    height: auto;
    padding: 10px;
    background-color: rgba(40, 40, 40, 0.5);
    font-family: 'regularF';
    font-size: 30px;
    border-radius: 4px;
    color: #fff;
    flex-direction: column;
    align-items: flex-start;
    justify-content: center;
    align-content: center;
    flex-wrap: nowrap;
}

div.contMenus > div {
    margin-left: 2% !important;
    padding: 0;
    margin: 0;
    width: auto;
}

div.contMenus > p {
    padding: 0;
    margin: 0;
}

div.contMenus {
    display: flex;
    flex-direction: row;
    pointer-events: all;
    flex-wrap: nowrap;
    height: auto;
    width: 100%;
    padding-top: 5%;
    padding-bottom: 1%;
    align-content: center;
    justify-content: space-between;
    align-items: center;
}

div#contDef {
    pointer-events: all;
}

/* Estilo iOS */
.switch__container {
  margin: 30px auto;
  width: 120px;
}

.switch {
  visibility: hidden;
  position: absolute;
  margin-left: 0;
}

.switch + label {
  display: block;
  position: relative;
  cursor: pointer;
  outline: none;
  user-select: none;
}

.switch--shadow + label {
    padding: 2px;
    width: 40px;
    height: 19px !important;
    background-color: #dddddd;
    border-radius: 25px;
}

.switch--shadow + label:before,
.switch--shadow + label:after {
  display: block;
  position: absolute;
  top: 1px;
  left: 1px;
  bottom: 1px;
  content: "";
}

.switch--shadow + label:before {
  right: 1px;
  background-color: #f1f1f1;
  border-radius: 60px;
  transition: background 0.4s;
}

.switch--shadow + label:after {
    width: 20px;
    height: 20px;
    background-color: #fff;
    border-radius: 100%;
    box-shadow: 0 2px 5px rgb(0 0 0 / 30%);
    transition: all 0.4s;
}

.switch--shadow:checked + label:before {
  background-color: #8ce196;
}

.switch--shadow:checked + label:after {
    transform: translateX(22px);
}

/* Estilo Flat */
.switch--flat + label {
  padding: 2px;
  width: 120px;
  height: 60px;
  background-color: #dddddd;
  border-radius: 60px;
  transition: background 0.4s;
}

.switch--flat + label:before,
.switch--flat + label:after {
  display: block;
  position: absolute;
  content: "";
}

.switch--flat + label:before {
  top: 2px;
  left: 2px;
  bottom: 2px;
  right: 2px;
  background-color: #fff;
  border-radius: 60px;
  transition: background 0.4s;
}

.switch--flat + label:after {
  top: 4px;
  left: 4px;
  bottom: 4px;
  width: 56px;
  background-color: #dddddd;
  border-radius: 52px;
  transition: margin 0.4s, background 0.4s;
}

.switch--flat:checked + label {
  background-color: #8ce196;
}

.switch--flat:checked + label:after {
  margin-left: 60px;
  background-color: #8ce196;
}

p#sair {
    margin-left: 95%;
    margin-bottom: 5%;
    margin-top: 0;
    background-color: #dd0000c7;
    text-align: center;
    pointer-events: all;
    border-bottom-left-radius: 5px;
    width: 5%;
    height: auto;
}

p#sair:hover {
    margin-left: 94%;
    margin-bottom: 5%;
    margin-top: 0;
    background-color: #dd0000c7;
    text-align: center;
    border-bottom-left-radius: 5px;
    pointer-events: all;
    width: 6%;
    height: auto;
}

.menuOpc {
    border-width: thin;
    background-color: ${corFundoMenu};
    position: absolute;
    left: 25%;
    top: 25%;
    border-radius: 20px;
    border-top-right-radius: 0% !important;
    border-style: double;
}

button.botaoMenu1 {
    background-color: #4a4a4a33;
    border-color: #0c0c0c29;
    width: auto;
    pointer-events: all;
    -webkit-text-stroke: thin;
    height: 20px;
    transition: 1s;
    border-radius: 10px;
}

button.botaoMenu1:hover {
    background-color: #4a4a4a33;
    -webkit-text-stroke: thin;
    border-color: #00000091;
    width: auto;
    pointer-events: all;
    transition: 1s;
    height: 20px;
    border-radius: 10px;
}

div#menu1 {
    background-color: ${corFundoMenu};
    width: 8%;
    font-size: small;
    display: flex;
    transition: ${tempoTransicao}s;
    transition-delay: 2s !important;
    border-bottom-right-radius: 25px;
    pointer-events: all;
    height: 5.5%;
    position: absolute;
    flex-direction: row;
    flex-wrap: nowrap;
    align-content: center;
    justify-content: space-evenly;
    align-items: center;
}

div#menu1:hover {
    background-color: ${corFundoMenu};
    width: 74%;
    display: flex;
    transition: ${corFundoMenu};
    transition-delay: 0s !important;
    border-bottom-right-radius: 25px;
    pointer-events: all;
    height: 7.5%;
    position: absolute;
    flex-direction: row;
    flex-wrap: nowrap;
    align-content: center;
    justify-content: space-evenly;
    align-items: center;

}

#unitInfoContainer {
    padding-top: 5%;
    display: none;
}

div#portatorConfig {
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    align-content: center;
    justify-content: space-around;
    align-items: center;
}

div#configControle {
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    align-content: center;
    justify-content: flex-start;
    align-items: center;
}

.toggle {
    margin-bottom: 40px;
}

.toggle > input {
    display: none;
}

.toggle > label {
    position: relative;
    display: block;
    height: 20px;
    width: 44px;
    background: #898989;
    border-radius: 100px;
    cursor: pointer;
    transition: all 0.3s ease;
}

.toggle > label:after {
    position: absolute;
    left: -2px;
    top: -3px;
    display: block;
    width: 26px;
    height: 26px;
    border-radius: 100px;
    background: #fff;
    box-shadow: 0px 3px 3px rgba(0,0,0,0.05);
    content: '';
    transition: all 0.3s ease;
}

.toggle > label:active:after {
    transform: scale(1.15, 0.85);
}

.toggle > input:checked ~ label {
    background: #6fbeb5;
}

.toggle > input:checked ~ label:after {
    left: 20px;
    background: #179588;
}

.toggle > input:disabled ~ label {
    background: #d5d5d5;
    pointer-events: none;
}

.toggle > input:disabled ~ label:after {
    background: #bcbdbc;
}

div#redesSociais {
    width: 100%;
    background-color: #50505091;
    height: auto;
}

.spanLink {
 width: 100%;
    text-align: center;
    font-family: fantasy;
    -webkit-text-stroke-width: 2px;
    -webkit-text-stroke-color: #5c5c5c8c;
    color: #000000a3;
}

#lobbyKey {
    font-size: 20px;
}

.spanLink:hover {
   width: 100%;
    text-align: center;
    font-family: fantasy;
    -webkit-text-stroke-width: 3px;
    -webkit-text-stroke-color: #5c5c5c8c;
    color: #000000a3;
}

.deadLink {
width: 100%;
    text-align: center;
    font-family: fantasy;
    -webkit-text-stroke-width: 2px;
    -webkit-text-stroke-color: #313a67d1;
    color: #000b2969;
}

.deadLink:hover {
    -webkit-text-stroke-width: 2px;
    -webkit-text-stroke-color: #5a6392d1;
    color: #0f39ab69;
}

#userNameInput {
    font-family: '-webkit-pictograph';
    font-size: 25px;
    padding: 0;
    margin: 0;
    border: 0;
    width: calc(100% - 30%);
    color: ${cor_daFont};
    background-color: ${cor_deFundo};
    text-align: center;
    border-radius: 40px;
    border-block: initial;
    border-color: #262626;
    border-style: double;
}

#userNameInput:hover {
    font-family: '-webkit-pictograph';
    font-size: 25px;
    padding: 0;
    margin: 0;
    border: 0;
    width: calc(100% - 20%);
    color: ${cor_daFont};
    background-color: ${cor_deFundo};
    text-align: center;
    border-radius: 40px;
    border-block: initial;
    border-color: #262626;
    border-style: double;
}

#userNameInput input:focus, .input-wrapper input:active{
    border-color:red;
}

#gameTitle {
width: auto;
    color: black;
    margin: 0;
    font-size: 3cm;
    font-family: fantasy;
}

#darkener {
display: block;
position: absolute;
width: 100%;
height: 100%;
}

.centerContent{
    border-block: unset;
    border-color: #00000040;
    border-style: double;
    text-align: center;
    height: 100%;
    display: flex !important;
    border-radius: 20px;
    flex-direction: column !important;
    flex-wrap: nowrap !important;
    align-content: center !important;
    justify-content: center !important;
    align-items: center !important;
}

#loadingContainer {
    color: #000000;
    font-size: calc(100% + 10px);
}

::placeholder{
color: #0000009e;
font-size: calc(100% - 40%);
}

#enterGameButton {
   font-family: '-webkit-pictograph';
    font-size: 25px;
    padding: 0;
    margin: 0;
    border: 0;
    width: calc(100% - 30%);
    color: ${cor_daFont};
    background-color: ${cor_deFundo};
    text-align: center;
    border-radius: 40px;
    border-block: initial;
    border-color: #262626;
    border-style: double;
}

#enterGameButton:hover {
   font-family: '-webkit-pictograph';
    font-size: 25px;
    padding: 0;
    margin: 0;
    border: 0;
    width: calc(100% - 20%);
    color: ${cor_daFont};
    background-color: ${cor_deFundo};
    text-align: center;
    border-radius: 40px;
    border-block: initial;
    border-color: #262626;
    border-style: double;
}

#skinInfo {
    display: grid;
    margin: 0;
    flex-direction: column;
    flex-wrap: nowrap;
    background-color: #00000026;
    align-content: center;
    padding: 0;
    background-color: ${cor_deFundo};
    position: relative;
    border-block: initial;
    border-color: #262626;
    border-style: double;
    justify-content: center;
    align-items: center;
}

#skinIcon {
    width: 100%;
    height: 100%;
    opacity: 0.4;
}

#containerForm {
    background-color: ${cor_deFundoHome2};
    width: auto;
    height: auto;
    display: flex;
    position: relative;
    border-radius: 20px;
    top: 0px;
    z-index: 100;
    align-items: center;
    text-align: center;
    cursor: crosshair;
    flex-direction: column;
    flex-wrap: nowrap;
    align-content: center;
    justify-content: center;
}

html, body{
  width: 100%;
  height: 100%;
}

.container{
    position: absolute;
    background: linear-gradient(0, #120c56, #000000);
    height: 100%;
    width: 100%;
}

#instructionsText {
display: none
}

#mainCanvas {
    position: absolute;
    width: 100%;
    height: 100%;
    cursor: crosshair;
}

div#skinSelecao {
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    align-items: center;
    justify-content: center;
    align-content: center;
}

div#frenteSkin {
    font-size: calc(100% + 200%);
}

div#atrasSkin {
    font-size: calc(100% + 200%);
}

div#frenteSkin:hover {
    font-size: calc(100% + 300%);
}

div#atrasSkin:hover {
    font-size: calc(100% + 300%);
}

img#logoHome {
    top: 0;
    width: 24.8%;
    z-index:1;
    position: absolute;
}

img#wallpaper {
    top: 0;
    z-index: 0;
    width: -webkit-fill-available;
    height: -webkit-fill-available;
}

#menuContainer {
    width: 100%;
    height: 100%;
    display: flex;
    top: 0;
    z-index: 2;
    align-items: center;
    text-align: center;
    flex-direction: column;
    flex-wrap: nowrap;
    align-content: center;
    justify-content: center;
}

p#atualizaFPS{
    padding: 0;
    -webkit-text-stroke: medium;
    margin: 0;
    text-transform: uppercase;
}

#gameUiContainer {
    position: absolute;
    width: 100%;
    height: 100%;
    display: none;
    pointer-events: none;
    background-color: rgb(2 0 108 / 33%);
}

`,document.head.appendChild(css);


//TELA INICIAL

let body = tagLinks.parentNode
body.removeChild(tagLinks)

linkYT.innerHTML = "";

adCont.innerHTML = "";

Clink.innerHTML = "";

leader.innerHTML = "";

links.innerHTML = "";

todosC.innerHTML = "";

inputName.onfocus = false;

enterGbotao.innerHTML = "<div>⚔COMEÇAR⚔</div>";

//FIM TELA INICIAL
     return addJS()
}

function modificaElementos(){

console.log("addJS: OK");

const status = document.getElementById("suportLoading")
document.body.removeChild(status)

let suportLoading = document.createElement("div")
suportLoading.id = "suportLoading"
suportLoading.innerHTML = `
CARREGADO...
<style>
div#suportLoading{
    width: 100%;
    font-size: 30px;
    align-items: center;
    font-family: fantasy;
    position: absolute;
    z-index: 10000;
    top: 0;
    text-align: center;
    color: green;
    height: auto;
    cursor: crosshair;
    }
    </style>
`;

document.body.appendChild(suportLoading)

    let configpainelpai = document.createElement("div")
    let configpainelpot = document.createElement("div")
    let configpainelfilho = document.createElement("div")
    let configpainelInput = document.createElement("input")
    let configpainelLabel = document.createElement("label")
    let configpainelfilho2 = document.createElement("div")
    let configpainelInput2 = document.createElement("input")
    let configpainelLabel2 = document.createElement("label")

//----------------------------------------------------------------------//

        configpainelpai.id = "configpai"

        configpainelfilho.class = "toggle"

        configpainelInput.type = "checkbox"
        configpainelInput.id = "mouse"
        configpainelInput.value = "mouse"
        configpainelInput.checked = true

        configpainelLabel.for = "mouse"
        configpainelLabel.innerText = "Mouse"

        configpainelfilho.appendChild(configpainelLabel)
        configpainelfilho.appendChild(configpainelInput)

//----------------------------------------------------------------------//

        configpainelfilho2.class = "toggle"

        configpainelInput2.type = "checkbox"
        configpainelInput2.id = "touchpad"
        configpainelInput2.value = "touchpad"

        configpainelLabel2.for = "touchpad"
        configpainelLabel2.innerText = "Touchpad"

        configpainelfilho2.appendChild(configpainelLabel2)
        configpainelfilho2.appendChild(configpainelInput2)

//----------------------------------------------------------------------//

        configpainelpot.id = "portatorConfig"
        configpainelpot.appendChild(configpainelfilho)
        configpainelpot.appendChild(configpainelfilho2)

        configpainelpai.appendChild(configpainelpot)

//----------------------------------------------------------------------//

    let linksSociais = document.createElement("div")
        linksSociais.id = "redesSociais"
        linksSociais.appendChild(configpainelpai)

    let formEnterGameClass = document.getElementsByClassName("centerContent")
        formEnterGameClass[0].id = "painel"

    let formEnterGame = document.getElementById("painel")

    let menucontainer = document.getElementById("menuContainer")

    let containerForm = document.createElement("div")
        containerForm.id = "containerForm"

//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||

    menucontainer.removeChild(formEnterGame)

    containerForm.appendChild(formEnterGame)
    containerForm.appendChild(linksSociais)

    menucontainer.appendChild(containerForm)

//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||

//SELEÇÃO DE SKIN PERSONALIZADA
    let avo = document.getElementById("userInfoContainer");
    let pai = document.createElement("div");
    let btnskin = document.getElementById("skinSelector");

pai.id = "skinSelecao";

    let anterior = document.createElement("div");

anterior.id = "atrasSkin";
anterior.innerHTML = "▶";
anterior.addEventListener('keyup', ()=>changeSkin(-1))

    let skinInf = document.getElementById("skinInfo");
    let prox = document.createElement("div");

prox.id = "frenteSkin";
prox.innerHTML = "◀";

avo.removeChild(btnskin);
avo.removeChild(skinInf);

pai.appendChild(skinInf);
pai.appendChild(anterior);

    let skinInfP = skinInf.parentNode;

skinInfP.insertBefore(prox,skinInf);

avo.appendChild(pai)


let nextSkin = document.getElementById("frenteSkin")
nextSkin.addEventListener('click', ()=>{
    changeSkin(1);

})


let vltSkin = document.getElementById("atrasSkin")
vltSkin.addEventListener('click', ()=>{
    changeSkin(-1);

})

//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||

//Adiciona uma logo na home

let container = document.getElementById("darkener")
let img = document.createElement("img")
img.id = "logoHome";
img.src = "https://github.com/PlayerX-000/img/blob/main/PlayerX.png?raw=true";
container.appendChild(img)

//adiciona um fundo na tela principal

let wallpaper = document.createElement("img")
wallpaper.id = "wallpaper";
wallpaper.src = "https://github.com/PlayerX-000/img/blob/main/1414647.jpg?raw=true"
container.appendChild(wallpaper)

//
//conecta a um servior

/*                                                   EM DESENVOLVIMENTO
    let cod = document.createElement("script")
    cod.type = "text/javascript"
    cod.src = `${host}/socket.io/socket.io.js`
   document.body.appendChild(cod)
*/
    //FIM TELA INICIAL


    return console.log("modificaElementos: OK")
}

function addJS(){

console.log("addCSS: OK")

adsbygoogle = undefined

$("#mouse").click(()=>{
let touchpad = document.getElementById("touchpad").checked
if(touchpad===true)document.getElementById("touchpad").checked = false;
})
$("#touchpad").click(()=>{
let mouse = document.getElementById("mouse").checked
if(mouse===true)document.getElementById("mouse").checked = false;
})

document.getElementById("enterGameButton").onclick = function(){enterGame()}




    return modificaElementos()
}


//FUNCÇÔES DO SCRIPT






////////////////FUNÇÕES USADAS PELO PLAYER



function layoutGame(){
let placarParty = document.getElementById("leaderboardContainer")

placarParty.innerHTML = ""
for(let a=0;a<placar.length;a++){

let divbtn = document.createElement("div")
let divLupa = document.createElement("div")
let btnSrc = document.createElement("button")

divbtn.innerHTML = `<div class='left' style='font-size: small; display: flex; flex-direction: row; flex-wrap: nowrap; align-items: center; justify-content: flex-start; align-content: center;'><div>${placar[a].posicao}º- </div><div style='overflow-x:hidden;pointer-evente:all'>${placar[a].nome}</div></div>`

btnSrc.className = "srcBase"
btnSrc.style = "pointer-events: all;"
btnSrc.id = placar[a].sid
btnSrc.innerText = "🔎"

divLupa.style = "font-size: small; display: flex; flex-direction: row; flex-wrap: nowrap; justify-content: flex-end; align-items: center; align-content: center;"
divLupa.innerHTML = `<div class='left' style='font-size: small;'> (${placar[a].pontos})</div>`

btnSrc.onclick = function(){

const idUser = Number(this.id)
users.filter((user)=>{
if(user.sid === idUser){
camX = user.x -  player.x
camY = user.y - player.y
}
})
}
divLupa.appendChild(btnSrc)
divbtn.appendChild(divLupa)
placarParty.appendChild(divbtn)
}
}
function criaMenus(){
  //tela do game
    let contAppend=document.getElementById("gameUiContainer")
    //div com os botoes
    let divMenuPai = document.createElement("div")

    let botao1 = document.createElement("button")
    let botao2 = document.createElement("button")
    let botao3 = document.createElement("button")
    let ico = document.createElement("p")

ico.id = "atualizaFPS"
botao1.innerText = "Base"
botao2.innerText = "Ajuda"
botao3.innerText = "Funções"
botao1.className = "botaoMenu1"
botao2.className = "botaoMenu1"
botao3.className = "botaoMenu1"

botao1.onclick = function(){
if(document.getElementById("menuOpc")===null){
    base()
}
}
botao2.onclick = function(){
if(document.getElementById("menuOpc")===null){
    configuracoes()
}
}
botao3.onclick = function(){
if(document.getElementById("menuOpc")===null){
opcoes()
}
}

divMenuPai.id = "menu1"

botao1.classList.add("hide");
botao2.classList.add("hide");
botao3.classList.add("hide");

divMenuPai.appendChild(ico)

contAppend.insertBefore(divMenuPai,contAppend.firstChild)

        divMenuPai.onmouseleave = () => {
/*
botao1.classList.add("hide");
botao2.classList.add("hide");
botao3.classList.add("hide");
*/
divMenuPai.removeChild(botao1)
divMenuPai.removeChild(botao2)
divMenuPai.removeChild(botao3)
}

        divMenuPai.onmouseover = () => {
divMenuPai.appendChild(botao1)
divMenuPai.appendChild(botao2)
divMenuPai.appendChild(botao3)
/*
botao1.classList.remove("hide");
botao2.classList.remove("hide");
botao3.classList.remove("hide");
*/
}

//pega o fps a cada 1 segundo

let before,now,fps,fpsps;
before=Date.now();
fps=0;
requestAnimationFrame(
    function loop(){
        now=Date.now();
        fps=Math.round(1000/(now-before));
        before=now;
        requestAnimationFrame(loop);
    }
 );

  setInterval(function(){
      if(gameState!==1) return
        fpsps=fps
      document.getElementById("atualizaFPS").innerText = "fps("+fpsps+")"
        },1000)



}
function alteraMapa(){
units.forEach((a)=>{
if(a.owner<0)a.renderIndex = 0
})
}

function lerEventos(){
	socket._emit = socket.emit;

	socket.emit = (...args) => {
        socket._emit(...args)
	}
}

const waitUntilReadyInterval = setInterval(() => {
	if (socket) {
		clearInterval(waitUntilReadyInterval);
		lerEventos();
	}
}, 100);


//ABRE popup Da BASE
function base(){

    //tela do game
    let contAppend=document.getElementById("gameUiContainer")
    //div com os botoes
    let divBase = document.createElement("div")
   let sellallbot = document.createElement("button")
   let dpkbot = document.createElement("button")
    let divBaseCont = document.createElement("div")
    let back = document.createElement("p")
       let containerPowerBOT = document.createElement("div")


       containerPowerBOT.className = "contMenus"

    containerPowerBOT.innerHTML = `<p>FullPower BOT </p><div class="switch__container">
  <input id="switch-shadowfpb" value="off" class="switch switch--shadow" type="checkbox">
  <label for="switch-shadowfpb"></label>
</div>
`

back.innerText = "X"
back.id = "sair"

sellallbot.innerText = "Vender tudo"
sellallbot.className = "botaoMenu1"
sellallbot.id = "vendetdBot"

dpkbot.innerText = "DPK bot"
dpkbot.className = "botaoMenu1"
dpkbot.id = "dpkBot"

    sellallbot.onclick = () => {vendeBot()}
        dpkbot.onclick = () => {dpkbots()}

divBase.id = "menuOpc"
divBase.className = "menuOpc"
divBase.style.width = "50%"
divBase.style.height = "50%"

divBaseCont.style=`
width: 65%;
    height: 75%;
    margin-left: 2%;
    pointer-events: auto;
    overflow: hidden auto;
    border: #001b66b5;
    border-style: outset;
    border-radius: 2%;
    border-inline: none;
`

divBase.appendChild(back)
divBaseCont.appendChild(sellallbot)
divBaseCont.appendChild(dpkbot)
divBaseCont.appendChild(containerPowerBOT)
divBase.appendChild(divBaseCont)

contAppend.insertBefore(divBase,contAppend.firstChild)

back.onclick = () => fechaBase(contAppend)



     var onOffFullpBOT = document.getElementById("switch-shadowfpb")
 if(onOffFPB=="off" && onOffFullpBOT.value == "on") onOffFullpBOT.click()
 if(onOffFPB=="on" && onOffFullpBOT.value == "off") onOffFullpBOT.click()
onOffFullpBOT.value = onOffFPB

onOffFullpBOT.onclick = () =>{
    if(onOffFullpBOT.value == "on"){
        onOffFullpBOT.value="off"
        onOffFPB = "off"
        clearInterval(fazBaseBot)
    }else if(onOffFullpBOT.value=="off"){
        onOffFullpBOT.value="on"
        onOffFPB = "on"
           window.fazBaseBot = setInterval(BaseBot,2000)
    }

}



}

const fechaBase = (contAppend) =>{
    let popup = document.getElementById("menuOpc")
    contAppend.removeChild(popup)
}

//ABRE popup Das configurações
function configuracoes(){
    //tela do game
    let contAppend=document.getElementById("gameUiContainer")
    let divPai = document.createElement("div")
    let divBaseConfig = document.createElement("div")
    let table = document.createElement("div");
    let back = document.createElement("p")

back.innerText = "X"
back.id = "sair"

divBaseConfig.id = "menuOpc"
divBaseConfig.className = "menuOpc"
divBaseConfig.style.width = "50%"
divBaseConfig.style.height = "50%"
divBaseConfig.appendChild(back)

divPai.style = `
    width: 100%;
    height: 80%;
    pointer-events: auto;
    overflow: hidden auto;
    border: outset rgba(0, 27, 102, 0.71);
    border-radius: 2%;
    border-inline: none;
`;

table.style = `
    width:100%;
    height:auto;
    pointer-events: all;
    display: flex;
    flex-direction: column;
    flex-wrap: nowrap;
    align-items: stretch;
    align-content: center;
    justify-content: flex-start;
`;

table.innerHTML = `
<table width="10%" border="1" cellspacing="0" cellpadding="4" style='width: 100%; height: max-content;'>

 <caption>Teclas do SCRIPT</caption>

  <colgroup>
    <col style="background-color: #00d0ff29;">
    <col style="background-color: #0000ff1c;">
    <col style="background-color: #ff003b0d;">
  </colgroup>

    <tbody>
 <tr align="center">
        <td>Tecla</td>
        <td>função</td>
        <td>explicação</td>
    </tr>

 <tr align="center">
        <td>V</td>
        <td>Lag</td>
        <td>Ativa e desativa lag</td>
    </tr>

     <tr align="center">
        <td>B</td>
        <td>JoinTroop</td>
        <td>Ativa e desativa a função de juntar tropas</td>
    </tr>

     <tr align="center">
       <td>O</td>
       <td>Min Zoom</td>
       <td>Aumenta o alcançe da camera</td>
    </tr>

       <tr align="center">
       <td>I</td>
       <td>Max Zoom</td>
       <td>Diminue o alcançe da camera</td>
    </tr>

      <tr align="center">
       <td>P</td>
       <td>Junta Tropa</td>
       <td>Junta todas as tropas selecionadas</td>
    </tr>

      <tr align="center">
       <td>C</td>
       <td>Def manual</td>
       <td>Defende manualmente</td>
    </tr>

         <tr align="center">
       <td>X</td>
       <td>Retira construçoes</td>
       <td>Tira construções desnecessarias para poder fazer full atk</td>
    </tr>

      <tr align="center">
       <td>Z</td>
       <td>Faz Base</td>
       <td>Faz ultima base que estava sendo utilizada ou padrão</td>
    </tr>

          <tr align="center">
       <td>Shift</td>
       <td>Faz Upgrade na Base</td>
       <td>Ataliza wall, barrack, armoury</td>
    </tr>

          <tr align="center">
       <td>E</td>
       <td>Compra Commander</td>
       <td>Compra e seleciona unidade: COMMANDER</td>
    </tr>

          <tr align="center">
       <td>Q</td>
       <td>Seleciona Soldier</td>
       <td>Seleciona todos os soldados do jogador</td>
    </tr>

          <tr align="center">
       <td>F</td>
       <td>Seleciona Tudo</td>
       <td>Seleciona todas as unidades exceto construções e siege</td>
    </tr>

          <tr align="center">
       <td>.</td>
       <td>Velocidade camera</td>
       <td>Aumenta a velocidade de movimentação da camera</td>
    </tr>

              <tr align="center">
       <td>* + Mensagem</td>
       <td>Fala dos Bots</td>
       <td>Enviar mensagem no chat com * na frente az com q todos os bots falem a msg</td>
    </tr>
    <tbody>
    </table>
`;
divPai.appendChild(table)
divBaseConfig.appendChild(divPai)


contAppend.insertBefore(divBaseConfig,contAppend.firstChild)

back.onclick = () => fechaConfiguracoes(contAppend)
}

const fechaConfiguracoes = (contAppend) =>{
    let popup = document.getElementById("menuOpc")
    contAppend.removeChild(popup)
}

//ABRE popup Das Opções
function opcoes(){

    //tela do game
let contAppend=document.getElementById("gameUiContainer")
    //div com os botoes
    let divBaseConfig = document.createElement("div")
    let divBaseConfigCont = document.createElement("div")
    let divBaseConfigInf = document.createElement("div")
    let divBaseConfigContP = document.createElement("div")
    let containerLink = document.createElement("div")
    let containerDef = document.createElement("div")
    let derrubar = document.createElement("div")
    let fullpower = document.createElement("div")
    let antKick = document.createElement("div")
    let fullatk = document.createElement("div")
    let textoLinksala = document.createElement("input")
    let linksala = document.createElement("button")
    let centralizaContainer = document.createElement("div")
    let centraliza = document.createElement("button")
    let spabot = document.createElement("button")
    let ultControl = document.createElement("div")
    let rembot = document.createElement("button")
    let qntbot = document.createElement("input")
    let back = document.createElement("p")


divBaseConfigInf.style = `
width: 50%;
    height: 100%;
display: flex;
    flex-direction: column;
    flex-wrap: nowrap;
    align-content: center;
    justify-content: center;
    align-items: center;
`
divBaseConfigInf.id = 'InfsMenu'
divBaseConfigInf.innerHTML = `Bots: ${window.sockets.length}`

divBaseConfigContP.style=`
display: flex;
    flex-flow: row nowrap;
    place-content: center space-between;
    align-items: center;
    width: 100%;
    height: 76%;
    margin-inline-start: auto;
    margin-inline-end: auto;
`

centralizaContainer.className = "contMenus"
antKick.className = "contMenus"
fullatk.className = "contMenus"
containerDef.className = "contMenus"
derrubar.className = "contMenus"
fullpower.className = "contMenus"

containerLink.id = "contLink"

back.innerText = "X"
back.id = "sair"

divBaseConfigCont.style = `
width: 100%;
    margin-left: 2%;
    height: 100%;
    pointer-events: auto;
    overflow: hidden auto;
    border: #001b66b5;
    border-style: outset;
    border-radius: 2%;
    border-inline: none;

`

divBaseConfig.id = "menuOpc"
divBaseConfig.className = "menuOpc"
divBaseConfig.style.width = "50%"
divBaseConfig.style.height = "50%"
divBaseConfig.appendChild(back)

linksala.innerText = "Copiar"
linksala.className = "botaoMenu1"
linksala.id = "copylink"


centraliza.innerText = "Centralizar"
centraliza.className = "botaoMenu1"
centraliza.id = "copylink"

spabot.innerText = "Add"
spabot.className = "botaoMenu1"
spabot.id = "SpawnBot"

rembot.id = "RemoveBot"
rembot.innerText = "Remove"
rembot.className = "botaoMenu1"

qntbot.id = "NumberBot"
qntbot.style = "width: 25%;border-radius: 15px;"
qntbot.type = "number"

ultControl.style = "display: flex; flex-direction: row; flex-wrap: nowrap; align-content: center; justify-content: center; align-items: center;"


ultControl.appendChild(rembot)
ultControl.appendChild(qntbot)
ultControl.appendChild(spabot)

textoLinksala.id = "linksala"
textoLinksala.value = "http://bloble.io/?l=" + partyKey
textoLinksala.type = "text"
textoLinksala.style = `
background-color: #898989;
border-radius: 10px;
`
centraliza.onclick = () => {
CE()
}

linksala.onclick = () => {
    const texto = document.getElementById("linksala")
    texto.select();
    texto.setSelectionRange(0, 99999)
    document.execCommand("copy");
    alert("Copiado")
                         }
spabot.onclick = async() =>{
var qntBot = document.getElementById("NumberBot").value


   if(onOffBot=="off") return
   if(gameState==0) return
    fechaOpcoes(contAppend)
let valor = Number(qntBot);
if(valor<=0)valor = 1;
  await Bots(valor)
}

rembot.onclick = async() =>{
var qntBot = document.getElementById("NumberBot").value

   if(onOffBot=="off") return
   if(gameState==0) return
    fechaOpcoes(contAppend)
let valor = Number(qntBot);
if(valor<=0)valor = 1;
classBot.RemoveBots(valor)
}




containerLink.appendChild(textoLinksala)
containerLink.appendChild(linksala)


derrubar.innerHTML = `<p>BOT's </p>
`,derrubar.appendChild(ultControl)

containerDef.innerHTML = `<p>DEFEND </p><div class="switch__container">
  <input id="switch-shadowDef" value="off" class="switch switch--shadow" type="checkbox">
  <label for="switch-shadowDef"></label>
</div>
`
fullpower.innerHTML = `
<p>FULL POWER </p><div class="switch__container">
  <input id="switch-shadowPower" value="off" class="switch switch--shadow" type="checkbox">
  <label for="switch-shadowPower"></label>
</div>
`
centralizaContainer.innerHTML = `
<p>CENTRALIZAR</p>
`,centralizaContainer.appendChild(centraliza)

antKick.innerHTML = `
<p>ANT KICK </p><div class="switch__container">
  <input id="switch-shadowAntKick" value="off" class="switch switch--shadow" type="checkbox">
  <label for="switch-shadowAntKick"></label>
</div>
`
fullatk.innerHTML = `
<p>FULL ATK AUTO </p><div class="switch__container">
  <input id="switch-shadowFullatk" value="off" class="switch switch--shadow" type="checkbox">
  <label for="switch-shadowFullatk"></label>
</div>
`

divBaseConfig.appendChild(containerLink)
divBaseConfigCont.appendChild(antKick)
divBaseConfigCont.appendChild(fullatk)
divBaseConfigCont.appendChild(derrubar)
divBaseConfigCont.appendChild(containerDef)
divBaseConfigCont.appendChild(fullpower)
divBaseConfigCont.appendChild(centralizaContainer)

divBaseConfigContP.appendChild(divBaseConfigCont)
divBaseConfigContP.appendChild(divBaseConfigInf)

divBaseConfig.appendChild(divBaseConfigContP)

contAppend.insertBefore(divBaseConfig,contAppend.firstChild)

back.onclick = () => fechaOpcoes(contAppend)

 //DEF
 var onOffDefelement = document.getElementById("switch-shadowDef")
 if(onOffDef=="off" && onOffDefelement.value == "on") onOffDefelement.click()
 if(onOffDef=="on" && onOffDefelement.value == "off") onOffDefelement.click()
onOffDefelement.value = onOffDef

onOffDefelement.onclick = () =>{
    if(onOffDefelement.value == "on"){
        onOffDefelement.value="off"
        onOffDef = "off"
clearInterval(defendLoop)
    }else if(onOffDefelement.value=="off"){
        onOffDefelement.value="on"
        onOffDef = "on"
window.defendLoop = setInterval(()=>{
defend.filtraInimigos(units,player);
defend.verificaDistancia();
defend.acionaDef(window.placeWalls);
},200)
    }

}


//Bots
/*
 var BotsS =  document.getElementById("switch-shadowDeRR")

 if(onOffBot=="off" && BotsS.value == "on") BotsS.click()
 if(onOffBot=="on" && BotsS.value == "off") BotsS.click()
BotsS.value = onOffBot
*/


//POWER
 var onOffPowerelement = document.getElementById("switch-shadowPower")
 if(onOffPower=="off" && onOffPowerelement.value == "on") onOffPowerelement.click()
 if(onOffPower=="on" && onOffPowerelement.value == "off") onOffPowerelement.click()
onOffPowerelement.value = onOffPower
onOffPowerelement.onclick = () =>{
    if(onOffPowerelement.value == "on"){
        onOffPowerelement.value="off"
        onOffPower = "off"
        clearInterval(power)
    }else if(onOffPowerelement.value=="off"){
        onOffPowerelement.value="on"
        onOffPower = "on"
   window.power = setInterval(()=>{

   gerador(socket)
   powerPlants(socket)
   },1000)
    }

}


//AUTO FULL ATK
 var onOffFKAelements = document.getElementById("switch-shadowFullatk")
 if(onOffFKA=="off" && onOffFKAelements.value == "on") onOffFKAelements.click()
 if(onOffFKA=="on" && onOffFKAelements.value == "off") onOffFKAelements.click()
onOffFKAelements.value = onOffFKA
onOffFKAelements.onclick = () =>{

    if(onOffFKAelements.value == "on"){
        onOffFKAelements.value="off"
        onOffFKA = "off"
        clearInterval(fullatkautoVar)
    }else if(onOffFKAelements.value=="off"){
        onOffFKAelements.value="on"
        onOffFKA = "on"

   window.fullatkautoVar = setInterval(()=>{

  fullatkauto(socket)
   },1000)
    }

}


//ANT KICK
 var onOffAntKick = document.getElementById("switch-shadowAntKick")
 if(onOffantkick=="off" && onOffAntKick.value == "on") onOffAntKick.click();
 if(onOffantkick=="on" && onOffAntKick.value == "off") onOffAntKick.click();
onOffAntKick.value = onOffantkick
onOffAntKick.onclick = () =>{
    if(onOffAntKick.value == "on"){
        onOffAntKick.value="off"
        onOffantkick = "off"
    }else if(onOffAntKick.value=="off"){
        onOffAntKick.value="on"
        onOffantkick = "on"
    }

}

}

const fechaOpcoes = (contAppend) =>{
    let popup = document.getElementById("menuOpc")
    contAppend.removeChild(popup)
}


//auto base(fullatk)
function fullatkauto(socket){
    let siegeExistbarrack, commanderExist, siegeExist


if(onOffFKA==="off") return

if(window.PowerPlayer<4000){
gerador(socket)
powerPlants(socket)
}else
if(window.PowerPlayer>4000){
commanderExist = units.some((unit)=>{
if(unit.type == 1 && unit.shape=="star" && unit.owner==player.sid) return unit
})

if(commanderExist==false){
spawnaComanderESeleciona()

}else{
    socket.emit("1",-2.08,309.99919886993257,8)
    for (var i = 0; i < units.length; ++i){
    if(2 == units[i].type && "square" == units[i].shape){
         socket.emit("4", units[i].id, 2)
     }
}


siegeExistbarrack = units.some((unit)=>{
if(unit.type == 2 && unit.shape=="square"  && unit.owner==player.sid) return unit
})

siegeExist = units.some((unit)=>{
if(unit.type == 1 && unit.shape=="triangle" && unit.uPath[0]==11  && unit.owner==player.sid) return unit
})

if(siegeExistbarrack==true){
if(siegeExist==true){
  for(let a=0;a<units.length;a++){
        if(units[a].uPath[0]==8 && units[a].uPath[1]==2 && units[a].owner==player.sid){
       let z = []
        z.push(units[a].id)
        socket.emit("3",z)
        }
        }

        for(let a=0;a<units.length;a++){
        if(units[a].uPath[0]==11 && units[a].owner==player.sid){
        selUnits.push(units[a])
            CE()
        }
        }
    tirafull()
    fullAtk(socket)
    setTimeout(()=>{soldadoarmory(socket)},800)
    setTimeout(()=>{UpgradeGreaterBarracks1(socket)},900)
    setTimeout(()=>{microGenerators(socket)},1000)
    setTimeout(()=>{
           onOffFKA = "off"
           clearInterval(fullatkautoVar)
    },1100)
    }else{
      let aer = []
units.forEach((a)=>{
if(a.owner==player.sid&&a.dir>0.1)aer.push(a.id)
})
socket.emit('3',aer)
 House(socket)
    }

    }
}
}
}



//centraliza
function CE() {
var trops = [];
    if (player.x == null) {
        player.x == 0.
    }
    if (player.y == null) {
        player.y == 0.
    }
for (var b = 0; b < selUnits.length; ++b){

    trops.push(selUnits[b].id);

}

socket.emit("5",
Math.floor((player.x))*(1.0000009999),
Math.floor((player.y))*(1.0000000999),
trops, 0, -1);

}




//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||

//PopUp Generico(pode ser definido um tempo em que ele sera visivel e uma mensagem)

const popUpGenerico=(Mensagem="...",Contador=false,Tempo=5000)=>{

    //tela do game
    let contAppend=document.getElementById("gameUiContainer")
    //div com os botoes
    let divBaseConfig = document.createElement("div")

    let back = document.createElement("p")

    let msg = document.createElement("div")

msg.style.width = "100%"
msg.style.height = "100%"
msg.style = "display: flex; flex-direction: column; flex-wrap: nowrap; align-content: center; justify-content: center; align-items: center"
msg.innerHTML = "<div style='text-align:center'>"+Mensagem+"</div>"


back.innerText = "X"
back.id = "sair"

divBaseConfig.id = "popUpGenerico"
divBaseConfig.className = "menuOpc"
divBaseConfig.style.width = "50%"
divBaseConfig.style.height = "20%"
divBaseConfig.appendChild(back)
divBaseConfig.appendChild(msg)

let veryG = document.getElementById("popUpGenerico")

if(veryG==null){
contAppend.insertBefore(divBaseConfig,contAppend.firstChild)
}else{
fechaPopUpGenerico(veryG)
contAppend.insertBefore(divBaseConfig,contAppend.firstChild)
}
if(Contador===true){
setTimeout(()=>{fechaPopUpGenerico(divBaseConfig)},Tempo)
}
back.onclick = () => fechaPopUpGenerico(divBaseConfig)
}

const fechaPopUpGenerico = (divBaseConfig) => {
    let pai = divBaseConfig.parentNode
    pai.removeChild(divBaseConfig)
}

//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||


//RETIRA OS BOTS
function RBots(objetivo=1){
let Qnt = objetivo;
let retirados = 0;

for(;retirados<Qnt;){
retirados+=1;
window.sockets[0].sock.close();
window.sockets.splice(0, 1);
console.log(retirados)
console.log(Qnt)
if(retirados==Qnt || window.sockets.length<=0){
popUpGenerico(`${retirados} de ${Qnt} removidos`,true,3000);
return
};
};



}
window.ioConn


//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||

//ADD OS BOTS

class CriacaoBots {
constructor(maxAdd,minAdd,limite){
this.max = maxAdd;
this.min = minAdd;
this.aviso = ``;
this.cont = 0;
this.valor = 0;
this.limite = limite;
};

RemoveBots(a){
let valor = a;
const ob = window.sockets.length - valor;
let atual = window.sockets.length;
if(ob<=0)valor = atual;
for(let a=0;a<valor;a++){
let arrBots = window.sockets.filter(bot => (bot!=undefined))
window.sockets = arrBots;
window.sockets[0].sock.close();
window.sockets.splice(0, 1);
}
}

addValor(valor){
this.valor = valor;
};

verificaValor(){
if(this.valor<this.min)this.valor = this.min,this.aviso = `! Quantidade de bots nao alcança o minimo esperado de ${this.min} Bot<br> -Numero de spawns alterado para ${this.min}`;
if(this.valor>this.max)this.valor = this.max,this.aviso = `! Quantidade de bots ultrapassa o limite de ${this.max} Bots<br> -Numero de spawns alterado para ${this.max}`;
};

verificaLimiteDeBots(){
if(window.sockets.length>=this.limite){
onOffBot = "off"
};
};

alertaLimiteAlcancado(){
return popUpGenerico(`Numero de bots alcançado... Para acesso completo fale com o PlayerX/DEV`,true,3000);
}

popUpGeraSocket(){
popUpGenerico(`
${this.aviso}<br>
${this.cont }/${this.valor}
`);
};

popUpSpawnaSocket(){
popUpGenerico("Spawnando Bots...",true,2000);
};

zeraAdd(){
this.aviso = ``;
this.cont = 0;
this.valor = 0;
};

spawnBots(){
window.sockets.forEach((socket,pos)=>{
if((pos)>=this.limite)return;
socket.sock.emit("spawn",{name:userNameInput.value,skin:13,},socket.captcha);
});
};
};

let spwVxMin = 1;
let spwVxMax = 5;
let limBots = 10;

const classBot = new CriacaoBots(spwVxMax,spwVxMin,limBots);

function criarArrBot(cap){
return new Promise(function (resolve, reject) {
try{
const socketz = io.connect(socket.io.uri,{query:"cid="+UTILS.getUniqueID()+'666PlayerX999'+"&rmid=undefined"});
window.sockets[window.idBot]={sock:socketz,captcha:cap};
resolve();
}catch(err){
reject(err);
};
});
};

async function Bots(a=1){
classBot.addValor(a)
classBot.verificaValor()
if(classBot.cont<classBot.valor){
classBot.verificaLimiteDeBots()
classBot.popUpGeraSocket()
await grecaptcha.execute("6Ldh8e0UAAAAAFOKBv25wQ87F3EKvBzyasSbqxCE").then((cap)=>{
criarArrBot(cap).then(res=>{
window.idBot+=1;
classBot.cont += 1;
}).catch(err=>{
throw err;
});
});
classBot.verificaValor()
if(onOffBot == "on"){
Bots(a);
}else{
classBot.alertaLimiteAlcancado();
classBot.spawnBots();
}
}else{
classBot.zeraAdd();
classBot.popUpSpawnaSocket();
classBot.spawnBots();
};
};


//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||


//SPAWNA BOTS
function SPAWN(){

    popUpGenerico("Spawnando Bots...",true,2000)
window.sockets.forEach((socket,pos)=>{
  socket.sock.emit("spawn",{name:userNameInput.value,skin:13,},socket.captcha)
})

}


//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||


//VERIFICA POWER DOS BOTS E CONSTROI FULLPOWER
function BaseBot(){
if(onOffFPB=="off")return
sockets.forEach((socket,pos)=>{

socket.sock.on("pt",function(a){
window.ptsBot = a

})


if(window.ptsBot<6000){
gerador(socket.sock)
 microGenerators(socket.sock)
 powerPlants(socket.sock)
}
})

}

//VERIFICA QUAL BASE PLAYER ESTA USANDO PARA REFAZER BASE ATUAL
function VeryBase(){
 
if(selBaseSpawn.load==true){
fazBaseCarregada()
}else
if(selBaseSpawn.padrao==true){
fullAtk(socket)
}else
if(selBaseSpawn.outra==true){

}
}



function resetVeryBase(){
selBaseSpawn.load = false;
selBaseSpawn.padrao = true;
selBaseSpawn.outra = false;
}

//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||
//teclas eventos

//ao soltar tecla
window.addEventListener("keyup",(a)=>{
    let tecla = event.keyCode || event.which
if (document.activeElement == mainCanvas){


if(tecla == window.teclas.speedCam.keyCode){ //caractere (ponto final)
    TecPonto = false;
    cameraSpd = (TecPonto==true ? 1.8 : .85) * (Math.log(maxScreenHeight / 1080) + 1)
}


}
})

//ao precionar tecla
window.addEventListener("keydown",async function(event){
    let tecla = event.keyCode || event.which
if (document.activeElement == mainCanvas) {

if(tecla == window.teclas.speedCam.keyCode){ //caractere (ponto final)
    TecPonto = true;
    cameraSpd = (TecPonto==true ? 1.8 : .85) * (Math.log(maxScreenHeight / 1080) + 1)
}
if(tecla==window.teclas.def.keyCode){ //tecla c
	placeWalls(socket);
}
if(tecla==window.teclas.resetaVerybase.keyCode){ //tecla t
	resetVeryBase();
}
if(tecla==window.teclas.lag.keyCode){ //tecla v
lagOnOff()
}
if(tecla==window.teclas.tiraInterno.keyCode){ //tecla x
tirafull()
}
if(tecla==window.teclas.fullatk.keyCode){ //tecla z
VeryBase()
}
if(tecla==window.teclas.joinTroop.keyCode){ //tecla b
joiOnOff()
}
if(tecla==window.teclas.JuntaTropa.keyCode){ //tecla p
       function movebot(){
    var e = [];
    var a = player.x + targetDst * MathCOS(targetDir) + camX,
            d = player.y + targetDst * MathSIN(targetDir) + camY;

        for (var b = 0; b < selUnits.length; ++b) {e.push(selUnits[b].id);}
        sockets.forEach((sock)=>{
              sock.sock.emit("5", a, d, e, 0, -1)
        })
    }
        movebot()
        if(onOffjointroop=="on"){
    if(onOffLag=="on"){
juntarComLag()
    }else if(onOffLag=="off"){
await juntarSemLag()
    }}else if(onOffjointroop=="off"){
    moveSemLag()
    }
}
if(tecla==window.teclas.selCommander.keyCode){ //tecla e
spawnaComanderESeleciona()
}
if(tecla==window.teclas.selSoldier.keyCode){ //tecla q
selecionaMenosCommander()
}
if(tecla==window.teclas.selAll.keyCode){ //tecla f
selecionaMenosSiege()
}
if(tecla==window.teclas.upgrade.keyCode){ //tecla Shift
 soldadoarmory(socket)
 UpgradeGreaterBarracks1(socket)
 microGenerators(socket)
 powerPlants(socket)
}
}
})



//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||

//aciona eventos enquanto mouse estiver pressionado(tropas seguem sem precisar ficar clicando com o mouse)

let intervalo
mainCanvas.addEventListener("mousedown",function(a){
    a.preventDefault();a.stopPropagation()

    if(document.activeElement!=mainCanvas) mainCanvas.focus();
    mouseStartX=maxScreenWidth/2+targetDst*MathCOS(targetDir);
    mouseStartY=maxScreenHeight/2+targetDst*MathSIN(targetDir);
    showSelector=!0;
    activeUnit?(showSelector=!1,3===a.which?toggleActiveUnit():unitList&&(a=unitList.indexOf(activeUnit),sendUnit(a))):3!==a.which&&2!==a.button||!selUnits.length||(showSelector=!1,"Unit"==selUnitType?  intervalo = setInterval(()=>{moveSelUnits()},100):setSelUnitGather())
});

mainCanvas.addEventListener("mouseup", function(){
   clearInterval(intervalo);
});

//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||

//entrar no game ao dar enter no input name(tela inicial)
document.getElementById("userNameInput").addEventListener("keypress",(tecla)=>{
        let cod = tecla.keyCode ? tecla.keyCode : tecla.which;
    if(cod && cod === 13) enterGame()
})

//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||

//liga desliga o Lag
function lagOnOff(){
if(onOffLag=="on"){
onOffLag="off"
}else if(onOffLag=="off"){
onOffLag="on"
}
}

//liga desliga o JoinTroop
function joiOnOff(){
if(onOffjointroop=="on"){
onOffjointroop="off"
}else if(onOffjointroop=="off"){
onOffjointroop="on"
}
}

//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||


//spawna full wall
function placeWalls() {
  let objwall=[{
           coamdnos:           socket.emit("1",-2.08,309.99919886993257,1),
           coamdnos:           socket.emit("1",-2.5,309.9985538675946,1),
           coamdnos:           socket.emit("1",-1.06,309.9996570965847,1),
           coamdnos:           socket.emit("1",-0.64,309.99990225804925,1),
           coamdnos:           socket.emit("1", -1.06, 310, 1),
           coamdnos:           socket.emit("1", -2.08, 310, 1),
           coamdnos:           socket.emit("1", -0.64, 310, 1),
           coamdnos:           socket.emit("1", -2.5, 310, 1),
           coamdnos:           socket.emit("1", -1.87, 306, 1),
           coamdnos:           socket.emit("1", -1.27, 306, 1),
           coamdnos:           socket.emit("1", -1.67, 306, 1),
           coamdnos:           socket.emit("1", -1.47, 306, 1),
           coamdnos:           socket.emit("1", -2.29, 306, 1),
           coamdnos:           socket.emit("1", -0.85, 306, 1),
           coamdnos:           socket.emit("1", -0.43, 306, 1),
           coamdnos:           socket.emit("1", -2.71, 306, 1),
           coamdnos:           socket.emit("1", -2.91, 306, 1),
           coamdnos:           socket.emit("1", -0.23, 306, 1),
           coamdnos:           socket.emit("1", -0.03, 306, 1),
           coamdnos:           socket.emit("1", -3.11, 306, 1),
           coamdnos:           socket.emit("1", 2.97, 306, 1),
           coamdnos:           socket.emit("1", 0.17, 306, 1),
           coamdnos:           socket.emit("1", 2.77, 306, 1),
           coamdnos:           socket.emit("1", 0.37, 306, 1),
           coamdnos:           socket.emit("1", 0.57, 306, 1),
           coamdnos:           socket.emit("1", 2.57, 306, 1),
           coamdnos:           socket.emit("1", 2.37, 306, 1),
           coamdnos:           socket.emit("1", 0.77, 306, 1),
           coamdnos:           socket.emit("1", 0.97, 306, 1),
           coamdnos:           socket.emit("1", 2.17, 306, 1),
           coamdnos:           socket.emit("1", 1.97, 306, 1),
           coamdnos:           socket.emit("1", 1.17, 306, 1),
           coamdnos:           socket.emit("1", 1.37, 306, 1),
           coamdnos:           socket.emit("1", 1.77, 306, 1),
           coamdnos:           socket.emit("1",Math.PI*-1.5,306,1),
           coamdnos:           socket.emit("1", -1.7, 245.85, 1),
           coamdnos:           socket.emit("1", -1.45, 245.85, 1),
           coamdnos:           socket.emit("1", -1.96, 245.85, 1),
           coamdnos:           socket.emit("1", -1.19, 245.85, 1),
           coamdnos:           socket.emit("1", -0.94, 245.85, 1),
           coamdnos:           socket.emit("1", -2.21, 245.85, 1),
           coamdnos:           socket.emit("1", -2.46, 245.85, 1),
           coamdnos:           socket.emit("1", -0.69, 245.85, 1),
           coamdnos:           socket.emit("1", -2.71, 245.85, 1),
           coamdnos:           socket.emit("1", -0.44, 245.85, 1),
           coamdnos:           socket.emit("1", -2.96, 245.85, 1),
           coamdnos:           socket.emit("1", -0.19, 245.85, 1),
           coamdnos:           socket.emit("1", 3.07, 245.85, 1),
           coamdnos:           socket.emit("1", 0.06, 245.85, 1),
           coamdnos:           socket.emit("1", 2.82, 245.85, 1),
           coamdnos:           socket.emit("1", 0.31, 245.85, 1),
           coamdnos:           socket.emit("1", 2.57, 245.85, 1),
           coamdnos:           socket.emit("1", 0.57, 245.85, 1),
           coamdnos:           socket.emit("1", 2.32, 245.85, 1),
           coamdnos:           socket.emit("1", 0.82, 245.85, 1),
           coamdnos:           socket.emit("1", 1.07, 245.85, 1),
           coamdnos:           socket.emit("1", 2.07, 245.85, 1),
           coamdnos:           socket.emit("1", 1.32, 245.85, 1),
           coamdnos:           socket.emit("1", 1.82, 245.85, 1),
           coamdnos:           socket.emit("1",Math.PI*-1.5,245.85,1),
           coamdnos:           socket.emit("1", -1.91, 184.69, 1),
           coamdnos:           socket.emit("1", -1.23, 184.4, 1),
           coamdnos:           socket.emit("1", -2.25, 185.57, 1),
           coamdnos:           socket.emit("1", -0.89, 184.93, 1),
           coamdnos:           socket.emit("1", -2.58, 190.21, 1),
           coamdnos:           socket.emit("1", -0.56, 190.16, 1),
           coamdnos:           socket.emit("1", -2.9, 186.72, 1),
           coamdnos:           socket.emit("1", -0.24, 185.76, 1),
           coamdnos:           socket.emit("1", 3.05, 183.1, 1),
           coamdnos:           socket.emit("1", 0.09, 183.95, 1),
           coamdnos:           socket.emit("1", 0.42, 189.81, 1),
           coamdnos:           socket.emit("1", 2.72, 189.79, 1),
           coamdnos:           socket.emit("1", 0.74, 187.09, 1),
           coamdnos:           socket.emit("1", 2.4, 188, 1),
           coamdnos:           socket.emit("1", 2.07, 181, 1),
           coamdnos:           socket.emit("1", 1.08, 181.02, 1),
           coamdnos:           socket.emit("1", 1.735, 188.31, 1),
           coamdnos:           socket.emit("1", 1.41, 188.81, 1),
           coamdnos:           socket.emit("1",Math.PI*1.5,140,1),
           coamdnos:           socket.emit("1", -2.095, 130, 1),
           coamdnos:           socket.emit("1", -1.048, 130, 1),
           coamdnos:           socket.emit("1", -2.565, 130, 1),
           coamdnos:           socket.emit("1", -0.58, 130, 1),
           coamdnos:           socket.emit("1", -3.035, 130, 1),
           coamdnos:           socket.emit("1", -0.09, 130, 1),
           coamdnos:           socket.emit("1", 0.38, 130, 1),
           coamdnos:           socket.emit("1", 2.78, 130, 1),
           coamdnos:           socket.emit("1", 2.3, 130, 1),
           coamdnos:           socket.emit("1", 0.86, 130, 1),
           coamdnos:           socket.emit("1", 1.83, 130, 1),
           coamdnos:           socket.emit("1", 1.33, 130, 1)
         }]
     objwall[0]
}


window.placeWalls = placeWalls

//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||

//cria full power
function gerador(socketB){
    socketB.emit("1",-1.7700175093099544, 243.8531699609419, 3)
    socketB.emit("1", 1.5700171594315573, 243.85007402090326, 3);
    socketB.emit("1", 2.4400100710526793, 196.79985467474305, 3);
    socketB.emit("1", 2.2400039007898447, 243.85656849877958, 3);
    socketB.emit("1", -2.7800023458624703, 194.6788252481507, 3);
    socketB.emit("1", 1.9699911201667188, 243.85313366860794, 3);
    socketB.emit("1", 2.0999878201715214, 185.58517209087591, 3);

    socketB.emit("1", 1.8700025978863808, 132.00487756139935, 3);
    socketB.emit("1", 1.2599938029024704, 132.00454272486235, 3);
    socketB.emit("1", 1.3800278697318928, 194.13178049974198, 3);
    socketB.emit("1", 1.7600061169825598, 194.06341746965091, 3);
    socketB.emit("1", -2.4400027616849433, 185.75130282181078, 3);
    socketB.emit("1", -2.1999936469647867, 131.99750300668575, 3);

    socketB.emit("1", -2.5899833434664847, 243.84680949317334, 3);
    socketB.emit("1", 3.0599865137335724, 131.9992848465475, 3);
    socketB.emit("1", 2.3700155322992322, 132.00115908582003, 3);
    socketB.emit("1", 2.7699990995853443, 180.63860107961412, 3);
    socketB.emit("1", 2.910001829109119, 243.8501927413633, 3);
    socketB.emit("1", 2.6399909192202835, 243.84888476267423, 3);
    socketB.emit("1", 3.1100150743706907, 196.05774072961268, 3);

    socketB.emit("1", -2.9699920613329622, 243.85151732150447, 3);
    socketB.emit("1", -2.690040409174835, 132.00027613607475, 3);
    socketB.emit("1", -2.3099851374683826, 243.85151732150447, 3);
    socketB.emit("1", -2.0399825212769436, 243.85142525726602, 3);
    socketB.emit("1", 0.7600044161827382, 132.00282572733062, 3);
    socketB.emit("1", 0.35996640663856383, 180.10304605974878, 3);
    socketB.emit("1", 0.029980358323314006, 197.1585985951411, 3);
    socketB.emit("1", -0.439963547142766, 132.00080795207285, 3);
    socketB.emit("1", 0.0800082011395776, 132.0022685411125, 3);
    socketB.emit("1", 0.22998938484625386, 243.85088271318605, 3);
    socketB.emit("1", 0.5000045603394669, 243.85230796529285, 3);

    socketB.emit("1", 0.7000201471114224, 196.1091423162112, 3);
    socketB.emit("1", 0.8999878082444033, 243.84691201653544, 3);
    socketB.emit("1", 1.0399986494012126, 186.08457861950842, 3);
    socketB.emit("1", 1.170002238251199, 243.8551629553904, 3);
    socketB.emit("1", -0.170023102819992, 243.84605081895415, 3);
    socketB.emit("1", -0.36001357695289626, 194.92632916053194, 3);
    socketB.emit("1", -0.7000068138510656, 183.7252296229344, 3);

    socketB.emit("1", -1.3600094643934062, 243.84717119540267, 3);
    socketB.emit("1", -1.0899817628353876, 243.84783862072678, 3);
    socketB.emit("1", -0.5500054440958607, 243.85303709406625, 3);
    socketB.emit("1", -0.8199991749608286, 243.85031002645857, 3);
    socketB.emit("1", -1.9300228177358634, 182.30682104627905, 3);
    socketB.emit("1", -1.199997990229862, 183.82290662482725, 3);
    socketB.emit("1", -0.9500096278543927, 131.99805036438974, 3);
    socketB.emit("1", -1.5699815385655684, 196.37006518306183, 3);
    socketB.emit("1", -1.5699629936544652, 132.00004583332537, 3);

}

//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||

//base full atk
const fullAtk=(socketB)=>{
    socketB.emit("1",-1.5700106126708684, 140.00004321427903, 7);
    socketB.emit("1",-2.08,309.99919886993257,8)
    socketB.emit("1",-2.5,309.9985538675946,8)
    socketB.emit("1",-1.06,309.9996570965847,8)
    socketB.emit("1",-0.64,309.99990225804925,8)
    socketB.emit("1", -1.87, 306, 1),socketB.emit("1", -1.27, 306, 1),socketB.emit("1", -1.67, 306, 1),socketB.emit("1", -1.47, 306, 1),socketB.emit("1", -2.29, 306, 1),socketB.emit("1", -0.85, 306, 1),socketB.emit("1", -0.43, 306, 1),socketB.emit("1", -2.71, 306, 1),socketB.emit("1", -2.91, 306, 1),socketB.emit("1", -0.23, 306, 1),socketB.emit("1", -0.03, 306, 1),socketB.emit("1", -3.11, 306, 1),socketB.emit("1", 2.97, 306, 1),socketB.emit("1", 0.17, 306, 1),socketB.emit("1", 2.77, 306, 1),socketB.emit("1", 0.37, 306, 1),socketB.emit("1", 0.57, 306, 1),socketB.emit("1", 2.57, 306, 1),socketB.emit("1", 2.37, 306, 1),socketB.emit("1", 0.77, 306, 1),socketB.emit("1", 0.97, 306, 1),socketB.emit("1", 2.17, 306, 1),socketB.emit("1", 1.97, 306, 1),socketB.emit("1", 1.17, 306, 1),socketB.emit("1", 1.37, 306, 1),socketB.emit("1", 1.77, 306, 1),socketB.emit("1",Math.PI*-1.5,306,1),socketB.emit("1", -1.7, 245.85, 4),socketB.emit("1", -1.45, 245.85, 4),socketB.emit("1", -1.96, 245.85, 4),socketB.emit("1", -1.19, 245.85, 4),socketB.emit("1", -0.94, 245.85, 4),socketB.emit("1", -2.21, 245.85, 4),socketB.emit("1", -2.46, 245.85, 4),socketB.emit("1", -0.69, 245.85, 4),socketB.emit("1", -2.71, 245.85, 4),socketB.emit("1", -0.44, 245.85, 4),socketB.emit("1", -2.96, 245.85, 4),socketB.emit("1", -0.19, 245.85, 4),socketB.emit("1", 3.07, 245.85, 4),socketB.emit("1", 0.06, 245.85, 4),socketB.emit("1", 2.82, 245.85, 4),socketB.emit("1", 0.31, 245.85, 4),socketB.emit("1", 2.57, 245.85, 4),socketB.emit("1", 0.57, 245.85, 4),socketB.emit("1", 2.32, 245.85, 4),socketB.emit("1", 0.82, 245.85, 4),socketB.emit("1", 1.07, 245.85, 4),socketB.emit("1", 2.07, 245.85, 4),socketB.emit("1", 1.32, 245.85, 4),socketB.emit("1", 1.82, 245.85, 4),socketB.emit("1",Math.PI*-1.5,245,4),socketB.emit("1", -1.91, 184.69, 4),socketB.emit("1", -1.23, 184.4, 4),socketB.emit("1", -2.25, 185.57, 4),socketB.emit("1", -0.89, 184.93, 4),socketB.emit("1", -2.58, 190.21, 4),socketB.emit("1", -0.56, 190.16, 4),socketB.emit("1", -2.9, 186.72, 4),socketB.emit("1", -0.24, 185.76, 4),socketB.emit("1", 3.05, 183.1, 4),socketB.emit("1", 0.09, 183.95, 4),socketB.emit("1", 0.42, 189.81, 4),socketB.emit("1", 2.72, 189.79, 4),socketB.emit("1", 0.74, 187.09, 4),socketB.emit("1", 2.4, 188, 4),socketB.emit("1", 2.07, 181, 4),socketB.emit("1", 1.08, 181.02, 4),socketB.emit("1", 1.735, 188.31, 4),socketB.emit("1", 1.41, 188.81, 4),socketB.emit("1", -2.095, 130, 4),socketB.emit("1", -1.048, 130, 4),socketB.emit("1", -2.565, 130, 4),socketB.emit("1", -0.58, 130, 4),socketB.emit("1", -3.035, 130, 4),socketB.emit("1", -0.09, 130, 4),socketB.emit("1", 0.38, 130, 4),socketB.emit("1", 2.78, 130, 4),socketB.emit("1", 2.3, 130, 4),socketB.emit("1", 0.86, 130, 4),socketB.emit("1", 1.83, 130, 4),socketB.emit("1", 1.33, 130, 4);
    }

//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||

//faz houses
const House=(socketB)=>{
socketB.emit("1", -1.7, 245.85, 4),socketB.emit("1", -1.45, 245.85, 4),socketB.emit("1", -1.96, 245.85, 4),socketB.emit("1", -1.19, 245.85, 4),socketB.emit("1", -0.94, 245.85, 4),socketB.emit("1", -2.21, 245.85, 4),socketB.emit("1", -2.46, 245.85, 4),socketB.emit("1", -0.69, 245.85, 4),socketB.emit("1", -2.71, 245.85, 4),socketB.emit("1", -0.44, 245.85, 4),socketB.emit("1", -2.96, 245.85, 4),socketB.emit("1", -0.19, 245.85, 4),socketB.emit("1", 3.07, 245.85, 4),socketB.emit("1", 0.06, 245.85, 4),socketB.emit("1", 2.82, 245.85, 4),socketB.emit("1", 0.31, 245.85, 4),socketB.emit("1", 2.57, 245.85, 4),socketB.emit("1", 0.57, 245.85, 4),socketB.emit("1", 2.32, 245.85, 4),socketB.emit("1", 0.82, 245.85, 4),socketB.emit("1", 1.07, 245.85, 4),socketB.emit("1", 2.07, 245.85, 4),socketB.emit("1", 1.32, 245.85, 4),socketB.emit("1", 1.82, 245.85, 4),socketB.emit("1",Math.PI*-1.5,245,4),socketB.emit("1", -1.91, 184.69, 4),socketB.emit("1", -1.23, 184.4, 4),socketB.emit("1", -2.25, 185.57, 4),socketB.emit("1", -0.89, 184.93, 4),socketB.emit("1", -2.58, 190.21, 4),socketB.emit("1", -0.56, 190.16, 4),socketB.emit("1", -2.9, 186.72, 4),socketB.emit("1", -0.24, 185.76, 4),socketB.emit("1", 3.05, 183.1, 4),socketB.emit("1", 0.09, 183.95, 4),socketB.emit("1", 0.42, 189.81, 4),socketB.emit("1", 2.72, 189.79, 4),socketB.emit("1", 0.74, 187.09, 4),socketB.emit("1", 2.4, 188, 4),socketB.emit("1", 2.07, 181, 4),socketB.emit("1", 1.08, 181.02, 4),socketB.emit("1", 1.735, 188.31, 4),socketB.emit("1", 1.41, 188.81, 4),socketB.emit("1", -2.095, 130, 4),socketB.emit("1", -1.048, 130, 4),socketB.emit("1", -2.565, 130, 4),socketB.emit("1", -0.58, 130, 4),socketB.emit("1", -3.035, 130, 4),socketB.emit("1", -0.09, 130, 4),socketB.emit("1", 0.38, 130, 4),socketB.emit("1", 2.78, 130, 4),socketB.emit("1", 2.3, 130, 4),socketB.emit("1", 0.86, 130, 4),socketB.emit("1", 1.83, 130, 4),socketB.emit("1", 1.33, 130, 4);
}
//tira construções desnecessarias para o full atk
function tirafull(){
for (var a = [], d = 0; d < units.length; ++d) {
if (units[d].owner == player.sid && units[d].type !=1) {
         let upath = units[d].uPath[0]
if(units[d].dir == -1.06) {
if(upath!==4 && upath!==7 && upath!==5 && upath!==2 && upath!==8){
a.push(units[d].id)
socket.emit("3", a)
}}}}
for (var a = [], d = 0; d < units.length; ++d) {
if (units[d].owner == player.sid && units[d].type !=1) {
         let upath = units[d].uPath[0]
if(units[d].dir == -2.08) {
if(upath!==4 && upath!==7 && upath!==5 && upath!==2 && upath!==8){
a.push(units[d].id)
socket.emit("3", a)
}}}}
for (var a = [], d = 0; d < units.length; ++d) {
if (units[d].owner == player.sid && units[d].type !=1) {
         let upath = units[d].uPath[0]
if(units[d].dir == -0.64) {
if(upath!==4 && upath!==7 && upath!==5 && upath!==2 && upath!==8){
a.push(units[d].id)
socket.emit("3", a)
}}}}
for (var a = [], d = 0; d < units.length; ++d) {
if (units[d].owner == player.sid && units[d].type !=1) {
         let upath = units[d].uPath[0]
if(units[d].dir == -2.5) {
if(upath!==4 && upath!==7 && upath!==5 && upath!==2 && upath!==8){
a.push(units[d].id)
socket.emit("3", a)
}}}}
var sellwall;
for(var i=0,s=[],s2=[];i<units.length;++i){
if (units[i].owner == player.sid && units[i].type !=1) {
         let upath = units[i].uPath[0]
sellwall = UTILS.getDistance(player.x,player.y,units[i].x,units[i].y);
if(upath!==4 && upath!==7 && upath!==5 && upath!==2 && upath!==8){
if(UTILS.roundToTwo(sellwall)<300){
s.push(units[i].id);
socket.emit("3",s);
}}}}}

//VENDE TUDO PARA OS BOTS
function vendeBot(){

      window.sockets.forEach(socket => {
          let userMesmoNome = []

        users.forEach((user)=>{
            if(user.name == player.name) userMesmoNome.push(user)
        })

        for (var a = [], d = 0; d < units.length; ++d) {

            userMesmoNome.forEach((bots)=>{
            if(units[d].type!=1 && units[d].owner == bots.sid ){a.push(units[d].id)
                socket.sock.emit("3", a);
                                                               }
        })

       }
    })
};

//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||

//upgrades

//upgrade para boulder
function UpgradeBoulder(socket){
        units.forEach(unit=>{
if(3 == unit.type && "circle" == unit.shape){
            socket.emit("4", unit.id, 0)
  }
})
}

//upgrade para spike
function UpgradeSpikes(socket){
        units.forEach(unit=>{
     if(3 == unit.type && "hexagon" == unit.shape){
         socket.emit("4", unit.id, 0)
     }
})
        }

//upgrade anti tank
function UpgradeAntiTankGun(socket){

        units.forEach(unit=>{
    if(0 == unit.type && 4 == unit.turretIndex && "circle" == unit.shape){
        socket.emit("4", unit.id, 1)
    }
})
}

//upgrade torreta longa
function UpgradeRangedTurret(socket){

      units.forEach(unit=>{
      if(0 == unit.type && 1 == unit.turretIndex && "circle" == unit.shape){
          socket.emit("4", unit.id, 1)
      }
})
}

//upgrade para spotter
function UpgradeSpotterTurret(socket){
     units.forEach(unit=>{
     if(0 == unit.type && 3 == unit.turretIndex && "circle" == unit.shape){
         socket.emit("4", unit.id, 0)
     }
 })
}


//upgrade para micro geradores
function microGenerators(socketB){
    units.forEach(unit=>{
        if (unit.type === 3 && "circle" == unit.shape) {
            socketB.emit("4", unit.id, 1)
        }
})
}

//upgrade para power plants
function powerPlants(socketB){
     units.forEach(unit=>{
        if (unit.type === 0 && "hexagon" == unit.shape) {
            socketB.emit("4", unit.id, 0)
        }
    })

}
//upgrade barracas
function UpgradeGreaterBarracks1(socketB){
     units.forEach(unit=>{
     if(2 == unit.type && "square" == unit.shape){
         socketB.emit("4", unit.id, 0)
     }
})
}

//upa soldados (upgrade armoury)
function soldadoarmory(socketB){
     for (var i = 0; i < units.length; ++i){
     if(0 == units[i].type && getUnitFromPath(units[i].uPath).name ==="Armory"){
         socketB.emit("4", units[i].id, 0);
     }
}
}

//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||

//move unidades
moveSelUnits = async function() {
    if (selUnits.length) {
        var a = player.x + targetDst * MathCOS(targetDir) + camX,
            d = player.y + targetDst * MathSIN(targetDir) + camY,
            c = 1;
        if (c && 1 < selUnits.length)
            for (var b = 0; b < users.length; ++b)
                if (UTILS.pointInCircle(a, d, users[b].x, users[b].y, users[b].size)) { c = 0; break }
        var g = -1;
        if (c)
            for (b = 0; b < units.length; ++b)
                if (units[b].onScreen && units[b].owner != player.sid && UTILS.pointInCircle(a, d, units[b].x, units[b].y, units[b].size)) {
                    c = 0;
                    g = units[b].id;
                    break
                }
        1 == selUnits.length && (c = 0);
    function movebot(){
    var e = [];
    var a = player.x + targetDst * MathCOS(targetDir) + camX,
            d = player.y + targetDst * MathSIN(targetDir) + camY;

        for (var b = 0; b < selUnits.length; ++b) {e.push(selUnits[b].id);}
        sockets.forEach((sock)=>{
              sock.sock.emit("5", a, d, e, 0, -1)
        })
    }
        movebot()
        if(onOffjointroop=="on"){
    if(onOffLag=="on"){
juntarComLag()
    }else if(onOffLag=="off"){
await juntarSemLag()
    }}else if(onOffjointroop=="off"){
    moveSemLag()
    }
    }
}

//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||

//junta sem lag
async function juntarSemLag(){
    var e = [];
    var a = player.x + targetDst * MathCOS(targetDir) + camX,
            d = player.y + targetDst * MathSIN(targetDir) + camY;
            for (var b = 0; b < selUnits.length; ++b) {e.push(selUnits[b].id);}
             await socket.emit("5", a, d, e, 0, -1)
}

//move sem juntar e sem lag
async function moveSemLag(){
    var e = [];
    var a = player.x + targetDst * MathCOS(targetDir) + camX,
            d = player.y + targetDst * MathSIN(targetDir) + camY;
            for (var b = 0; b < selUnits.length; ++b) {e.push(selUnits[b].id);}
             await socket.emit("5", a, d, e, 1, -1)
}


//junta com lag2
function juntarComLag2(){
   let a = player.x + targetDst * MathCOS(targetDir) + camX,
       d = player.y + targetDst * MathSIN(targetDir) + camY;
   let arrayTropa = [];
    selUnits.forEach((tropa)=>{arrayTropa.push(tropa.id)});

    envTropa1(a,d,arrayTropa)
    envTropa2(a,d,arrayTropa)
    envTropa3(a,d,arrayTropa)

    setTimeout(()=>{
   let loop1 = setInterval(()=>{
       juntarComLag2()
    },100)
   setTimeout(()=>{
   clearInterval(loop1)
   },500)
    },100)

        setTimeout(()=>{
   let loop1 = setInterval(()=>{
       juntarComLag2()
    },100)
   setTimeout(()=>{
   clearInterval(loop1)
   },500)
    },200)

        setTimeout(()=>{
   let loop1 = setInterval(()=>{
       juntarComLag2()
    },100)
   setTimeout(()=>{
   clearInterval(loop1)
   },500)
    },300)


}

function envTropa1(a,d,arrayTropa){
socket.emit("5", UTILS.roundToOne(a), UTILS.roundToOne(d), arrayTropa, 0, -1);
socket.emit("5", UTILS.roundToOne(a), UTILS.roundToOne(d), arrayTropa, 0, -1);
socket.emit("5", UTILS.roundToOne(a), UTILS.roundToOne(d), arrayTropa, 0, -1);
socket.emit("5", UTILS.roundToOne(a), UTILS.roundToOne(d), arrayTropa, 0, -1);
};
function envTropa2(a,d,arrayTropa){
socket.emit("5", a,d, arrayTropa, 0, -1);
socket.emit("5", a,d, arrayTropa, 0, -1);
socket.emit("5", a,d, arrayTropa, 0, -1);
socket.emit("5", a,d, arrayTropa, 0, -1);
};
function envTropa3(a,d,arrayTropa){
socket.emit("5", UTILS.roundToTwo(a), UTILS.roundToTwo(d), arrayTropa, 0, -1);
socket.emit("5", UTILS.roundToTwo(a), UTILS.roundToTwo(d), arrayTropa, 0, -1);
socket.emit("5", UTILS.roundToTwo(a), UTILS.roundToTwo(d), arrayTropa, 0, -1);
socket.emit("5", UTILS.roundToTwo(a), UTILS.roundToTwo(d), arrayTropa, 0, -1);
};
function envTropa4(a,d,arrayTropa){
socket.emit("5", UTILS.roundToOne(a), UTILS.roundToTwo(d), arrayTropa, 0, -1);
socket.emit("5", UTILS.roundToTwo(a), UTILS.roundToOne(d), arrayTropa, 0, -1);
socket.emit("5", UTILS.roundToOne(a), UTILS.roundToTwo(d), arrayTropa, 0, -1);
socket.emit("5", UTILS.roundToTwo(a), UTILS.roundToOne(d), arrayTropa, 0, -1);
};


///////////////////////////////////////////////////////////////////////////////////////////


function juntarComLag(){
   let a = player.x + targetDst * MathCOS(targetDir) + camX,
       d = player.y + targetDst * MathSIN(targetDir) + camY;
selUnits.forEach((tropa)=>{
if(tropa.owner==player.sid && tropa.type==1){
socket.emit("5", a,d, [tropa.id], 0, -1);
socket.emit("5", UTILS.roundToOne(a), UTILS.roundToOne(d), [tropa.id], 0, -1);
socket.emit("5", UTILS.roundToTwo(a), UTILS.roundToTwo(d), [tropa.id], 0, -1);
socket.emit("5", a,d, [tropa.id], 0, -1);
}
})
}

//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||

//adiciona os menus na tela do game
let setaVars = setInterval(()=>{
if(socket && gameState==1){
    clearInterval(setaVars)
        criaMenus()
}
},500)


//modifica menus do game



//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||

//seleciona tropas
function selecionaMenosCommander(){
        selUnits = [];
        units.forEach((unit) => {
        if (unit.owner === player.sid && unit.type === 1) {
        if (!unit.info) unit.info = getUnitFromPath(unit.uPath);
        unit.info.name !== 'Commander' && unit.info.name !== 'Siege Ram' &&selUnits.push(unit)
}});
        selUnitType = "Unit";
}


function selecionaMenosSiege(){
               selUnits = [];
        units.forEach((unit) => {
        if (unit.owner === player.sid && unit.type === 1) {
        if (!unit.info) unit.info = getUnitFromPath(unit.uPath);
        unit.info.name !== 'Siege Ram' &&selUnits.push(unit)
}});
        selUnitType = "Unit";
}

function spawnaComanderESeleciona(){
    socket.emit("4",0,0,1);
    window.sockets.forEach((socket)=>{
    socket.sock.emit("4",0,0,1);
    })
        selUnits = [];
        units.forEach((unit) => {
        if (unit.owner === player.sid && unit.type === 1) {
        if (!unit.info) unit.info = getUnitFromPath(unit.uPath);
        if (unit.info.name === 'Commander') {
        selUnits.push(unit)
}}});
        selUnitType = "Unit";

}


//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||


//base dpk V2
   function dpkbots(){
    window.sockets.forEach((bot) => {
        const socket = bot.sock
socket.emit("1",-3.1400017458410745,132.00016704534883,3);
socket.emit("1",-2.616686461722192,132.00119469156337,3);
socket.emit("1",-2.093428548209908,132.00104734432995,3);
socket.emit("1",-1.5701145087187327,132.00003068181462,3);
socket.emit("1",-1.0467734858480617,132.0030552676717,3);
socket.emit("1",-0.5235155658601258,131.9990246176084,3);
socket.emit("1",-0.00022727272335942278,132.00000340909085,3);
socket.emit("1",0.523073890253546,132.00002310605853,3);
socket.emit("1",1.0463973901061703,131.9971048924937,3);
socket.emit("1",1.5697357211319762,132.00007424240337,3);
socket.emit("1",-3.139991347768931,306.00039232000995,1);
socket.emit("1",-2.923994196541792,305.99577121261,1);
socket.emit("1",-2.7079979891398973,305.9964967119722,1);
socket.emit("1",-2.492000077058938,306.00367726548654,1);
socket.emit("1",-2.276016223968046,306.00062516276,1);
socket.emit("1",-2.060007793381665,306.0030262922248,1);
socket.emit("1",-1.8439875536674648,305.9980001568637,1);
socket.emit("1",-1.6279843105192338,306.0002452613396,1);
socket.emit("1",-1.4119926259902449,306.00035065339387,1);
socket.emit("1",-1.1960064618373838,306.0012058799769,1);
socket.emit("1",-0.9799930163427818,305.9987898668882,1);
socket.emit("1",-0.7640215518210055,305.99966094752466,1);
socket.emit("1",-0.5480025429968127,305.99828839390597,1);
socket.emit("1",-0.3320125932586849,306.0012609451144,1);
socket.emit("1",-0.11601286924045082,305.99689540908753,1);
socket.emit("1",0.10000358459797759,305.99882908272707,1);
socket.emit("1",0.31598401089984723,305.9997232024892,1);
socket.emit("1",0.5319958032307893,306.00034722202525,1);
socket.emit("1",0.7480000132173787,305.99521728288505,1);
socket.emit("1",0.964003270834421,305.99613886452875,1);
socket.emit("1",1.1800097508428806,305.999376633352,1);
socket.emit("1",1.3959878271385584,306.003535927283,1);
socket.emit("1",1.6119845064123546,305.99952222184925,1);
socket.emit("1",1.8280052688256236,305.99612824347963,1);
socket.emit("1",2.0440168675640136,305.99756289879167,1);
socket.emit("1",2.2599863338360344,306.00132957227487,1);
socket.emit("1",2.4759978600339494,305.994679692311,1);
socket.emit("1",2.6919903375268674,306.0003075161853,1);
socket.emit("1",2.908003886220855,306.000367646838,1);
socket.emit("1",0.8699987279653572,243.8481535710288,5);
socket.emit("1",1.210014562203788,243.84870083722004,5);
socket.emit("1",1.5600109838562193,243.85418286344807,5);
socket.emit("1",2.609999577077718,243.85133196273503,5);
socket.emit("1",2.9599932123218666,243.84984560175542,5);
socket.emit("1",-2.9699920613329622,243.85151732150447,5);
socket.emit("1",-2.6199947908961105,243.84557900441834,5);
socket.emit("1",-2.269992483231978,243.84610003032654,5);
socket.emit("1",-1.919991274434831,243.84651279032065,5);
socket.emit("1",-1.5700171594315573,243.85007402090326,5);
socket.emit("1",-1.2500054152201767,243.8496672132238,5);
socket.emit("1",-0.5199803036175189,243.84989235183193,5);
socket.emit("1",-0.8699987279653568,243.84815357102872,5);
socket.emit("1",-0.17002310281999192,243.84605081895427,5);
socket.emit("1",0.18001488891124995,243.85037153959803,5);
socket.emit("1",0.5299754465231121,243.851702680133,5);
socket.emit("1",2.100015962749604,131.99701966332432,3);
socket.emit("1",2.616310321066522,131.99528817347996,3);
socket.emit("1",-3.139994716805523,194.00024768025426,2);
socket.emit("1",-2.791214196322064,193.99668089944223,2);
socket.emit("1",-2.442392890871587,194.0008505135995,2);
socket.emit("1",-2.093605849859661,194.0052705469621,2);
socket.emit("1",-1.744817577540963,194.0000850515278,2);
socket.emit("1",-1.047200313208691,194.00092809056352,2);
socket.emit("1",-0.6983945911642702,194.00021649472453,2);
socket.emit("1",-0.0008247420810452244,194.00006597937022,2);
socket.emit("1",0.34801353139633523,193.99990335049142,2);
socket.emit("1",0.6967842348778635,193.99932577202424,2);
socket.emit("1",1.0455826284612566,193.99761699567333,2);
socket.emit("1",1.394419117420156,193.99974664931912,2);
socket.emit("1",1.7431991142527825,193.99590923522064,2);
socket.emit("1",2.092013943372238,194.0006639163897,2);
socket.emit("1",2.4407825661619134,194.00249586023364,2);
socket.emit("1",2.7895848737881193,194.00599011370753,2);
socket.emit("1",1.910002502175056,243.85508237475804,5);
socket.emit("1",2.2699924832319778,243.84610003032665,5);
socket.emit("1",-1.3900285221526352,189.7823239925152,2);
socket.emit("1",-0.3600050614110291,188.68568838149864,2);
UpgradeBoulder(socket)
UpgradeSpikes(socket)
UpgradeAntiTankGun(socket)
UpgradeRangedTurret(socket)
UpgradeSpotterTurret(socket)
    })
        }


//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||

//loops

 

   window.antkick = setInterval(()=>{
   if(onOffantkick=="off") return
   if(gameState==0) return
       antKickGame()
   },80000)



//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||


//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||

//ANT KICK
function antKickGame(){
     socket.emit("2", 0, 0);
     socket.emit("2", Math.round(camX), Math.round(camY));
     socket.emit("2",camX,camY);
    if(window.sockets.length>0){
    window.sockets.forEach((socket)=>{
     socket.sock.emit("2", 0, 0);
     socket.sock.emit("2", Math.round(camX), Math.round(camY));
     socket.sock.emit("2",camX,camY);
    })
    }
}

//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||



//chama funçoes para iniciar hack
    try{
    preLoad();
    }catch(erro){
    alert(erro)
    throw erro
    }

//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||


//cria uma area - se detectar um inimigo ele ativa o def (by PlayerX)

/* def tipo 1
function reconhecimento(){
if(onOffDef=="off") return
units.forEach(async(unit) => {
if(unit.owner!==player.sid && (unit.x>(player.x-390))&&(unit.x<(player.x+390))&&(unit.y>(player.y-390))&&(unit.y<(player.y+390))){
await coloc()
}
})
}


   window.defend = setInterval(()=>{
   reconhecimento()
   },100)
*/



/*     def tipo 2
window.setInterval(() => {
    let Acct = false
	units.forEach(unit => {
		if (unit.owner === player.sid) return;
		const distance = Math.sqrt((unit.x - player.x) ** 2 + (unit.y - player.y) ** 2);

		if (distance < 400) Acct=true;
	});

	if (onOffDef=="on" && Acct==true) {
		window.placeWalls(socket);
	}
}, 200);
*/



class Defend {

filtraInimigos(units,player){
this.unidades = units;
this.jogador = player;


this.inimigos = this.unidades.map((unit)=>{
if(unit.owner!==this.jogador.sid && unit.speed>0)return unit
})

this.inimigos = this.inimigos.filter(unit => (unit!=undefined))

}

verificaDistancia(){
this.interruptor = this.inimigos.some((unidadeInimiga)=>{
	const distance = Math.sqrt((unidadeInimiga.x - player.x) ** 2 + (unidadeInimiga.y - player.y) ** 2);
    if(distance<=399) return unidadeInimiga
})
}

acionaDef(defend){
if(this.interruptor && onOffDef==="on"){
defend()
}
}



}

const defend = new Defend()

//------------------------------------------------------------------------------------------||------------------------------------------------------------------------------------------||