Advertisement
Guest User

Agario maybe better glitchy bot with toggle and stuff

a guest
May 11th, 2015
2,216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // ==UserScript==
  2.  
  3. // @name       Vawlt Agar.io Bot
  4. // @namespace   Vawlt
  5. // @include     http://agar.io/*
  6. // @version     1
  7. // @grant       none
  8. // @author      twitch.tv/apostolique
  9. // @run-at document-start
  10. // ==/UserScript==
  11.  
  12. var changed = 0; // script need to be edited with
  13.  
  14. window.addEventListener('beforescriptexecute', function (e) {
  15.  
  16.     //for external script:
  17.     src = e.target.src;
  18.     if (src.search(/main_out\.js..../) != -1) {
  19.         console.log('event listener fired, main_out found');
  20.         changed++;
  21.         e.preventDefault();
  22.         e.stopPropagation();
  23.         append(main_out);
  24.         //init();
  25.     };
  26.  
  27.     //when done, remove the listener:
  28.     if (changed == 1)
  29.         window.removeEventListener(e.type, arguments.callee, true);
  30.  
  31. }, true);
  32.  
  33. ////// append with new block function:
  34. function append(s) {
  35.     console.log('append fired');
  36.     document.head.appendChild(document.createElement('script'))
  37.     .innerHTML = s.toString().replace(/^function.*{|}$/g, '');
  38. }
  39.  
  40. ////////////////////////////////////////////////
  41. function main_out() {
  42. $.getScript('https://raw.githubusercontent.com/maxkueng/victor/master/build/victor.js', function()
  43. {
  44.     (function (self, $) {
  45.         /**
  46.          * @return {undefined}
  47.          */
  48.         function init() {
  49.             console.log("init fired");
  50.             getRegions();
  51.             setInterval(getRegions, 18E4);
  52.             /** @type {(HTMLElement|null)} */
  53.             canvas = tempCanvas = document.getElementById("canvas");
  54.             canvas.width *= 2;
  55.             canvas.height *= 2;
  56.             canvasContext = canvas.getContext("2d");
  57.             canvas.onmousedown = function (e) {
  58.                 if (options) {
  59.                     var z0 = e.clientX - (5 + width / 5 / 2);
  60.                     var z1 = e.clientY - (5 + width / 5 / 2);
  61.  
  62.                     if (Math.sqrt(z0 * z0 + z1 * z1) <= width / 5 / 2) {
  63.                         sendMovementToServer();
  64.                         sendServerCommand(17);
  65.                         return;
  66.                     }
  67.                 }
  68.                 currentMouseX = e.clientX;
  69.                 currentMouseY = e.clientY;
  70.                 recalculateDestination();
  71.                 sendMovementToServer();
  72.             };
  73.             canvas.onmousemove = function (e) {
  74.                 currentMouseX = e.clientX;
  75.                 currentMouseY = e.clientY;
  76.                
  77.                 useMouseX = (currentMouseX - width/2 + cellX*screenRatio) / screenRatio;
  78.                 useMouseY = (currentMouseY - height/2 + cellY*screenRatio) / screenRatio;
  79.                
  80.                 tempPoint = [useMouseX, useMouseY, 1];
  81.                
  82.                 recalculateDestination();
  83.             };
  84.             canvas.onmouseup = function (evt) {};
  85.             var b = false;
  86.             var a = false;
  87.             var all = false;
  88.             self.onkeydown = function (e) {
  89.                 if (84 == e.keyCode) {
  90.                     console.log("Toggle");
  91.                     toggle = !toggle;
  92.                 }
  93.                 if (82 == e.keyCode) {
  94.                     console.log("ToggleDraw");
  95.                     toggleDraw = !toggleDraw;
  96.                 }
  97.                 if (87 == e.keyCode) {
  98.                     if (zoom > 0) {
  99.                         zoom -= 1;
  100.                     }
  101.                 }
  102.                 if (69 == e.keyCode) {
  103.                     zoom += 1;
  104.                 }
  105.                 if (!(32 != e.keyCode)) {
  106.                     if (!b) {
  107.                         sendMovementToServer();
  108.                         sendServerCommand(17);
  109.                         b = true;
  110.                     }
  111.                 }
  112.                 if (!(69 != e.keyCode)) {
  113.                         sendServerCommand(1);
  114.                 }
  115.                 if (!(81 != e.keyCode)) {
  116.                     if (!a) {
  117.                         sendServerCommand(18);
  118.                         a = true;
  119.                     }
  120.                 }
  121.                 if (!(87 != e.keyCode)) {
  122.                     if (!all) {
  123.                         sendMovementToServer();
  124.                         sendServerCommand(21);
  125.                         all = true;
  126.                     }
  127.                 }
  128.             };
  129.             self.onkeyup = function (event) {
  130.                 if (32 == event.keyCode) {
  131.                     b = false;
  132.                 }
  133.                 if (87 == event.keyCode) {
  134.                     all = false;
  135.                 }
  136.                 if (81 == event.keyCode) {
  137.                     if (a) {
  138.                         sendServerCommand(19);
  139.                         a = false;
  140.                     }
  141.                 }
  142.             };
  143.             self.onblur = function () {
  144.                 sendServerCommand(19);
  145.                 all = a = b = false;
  146.             };
  147.             self.onresize = onResize;
  148.             onResize();
  149.             if (self.requestAnimationFrame) {
  150.                 self.requestAnimationFrame(anim);
  151.             } else {
  152.                 setInterval(draw, 1E3 / 60);
  153.             }
  154.             setInterval(sendMovementToServer, 5);
  155.             done($("#region").val());
  156.         }
  157.         function processData() {
  158.             var v = Number.POSITIVE_INFINITY;
  159.             var j = Number.POSITIVE_INFINITY;
  160.             var bottom = Number.NEGATIVE_INFINITY;
  161.             var maxY = Number.NEGATIVE_INFINITY;
  162.             var newDuration = 0;
  163.             var i = 0;
  164.             for (; i < items.length; i++) {
  165.                 newDuration = Math.max(items[i].size, newDuration);
  166.                 v = Math.min(items[i].x, v);
  167.                 j = Math.min(items[i].y, j);
  168.                 bottom = Math.max(items[i].x, bottom);
  169.                 maxY = Math.max(items[i].y, maxY);
  170.             }
  171.             context = QUAD.init({
  172.                     minX : v - (newDuration + 100),
  173.                     minY : j - (newDuration + 100),
  174.                     maxX : bottom + (newDuration + 100),
  175.                     maxY : maxY + (newDuration + 100)
  176.                 });
  177.             i = 0;
  178.             for (; i < items.length; i++) {
  179.                 if (v = items[i], v.shouldRender()) {
  180.                     j = 0;
  181.                     for (; j < v.points.length; ++j) {
  182.                         context.insert(v.points[j]);
  183.                     }
  184.                 }
  185.             }
  186.         }
  187.         function recalculateDestination() {
  188.             moveX = (currentMouseX - width / 2) / screenRatio + cellX;
  189.             moveY = (currentMouseY - height / 2) / screenRatio + cellY;
  190.         }
  191.         function getRegions() {
  192.             if (null == old) {
  193.                 old = {};
  194.                 $("#region").children().each(function () {
  195.                     var option = $(this);
  196.                     var name = option.val();
  197.                     if (name) {
  198.                         old[name] = option.text();
  199.                     }
  200.                 });
  201.             }
  202.             $.get("http://m.agar.io/info", function (b) {
  203.                 var name;
  204.                 for (name in b.regions) {
  205.                     $('#region option[value="' + name + '"]').text(old[name] + " (" + b.regions[name].numPlayers + " players)");
  206.                 }
  207.             }, "json");
  208.         }
  209.         function done(mat) {
  210.             if (mat) {
  211.                 if (mat != dest) {
  212.                     dest = mat;
  213.                     after();
  214.                 }
  215.             }
  216.         }
  217.         function next() {
  218.             $.ajax("http://m.agar.io/", {
  219.                 error : function () {
  220.                     setTimeout(next, 1E3);
  221.                 },
  222.                 success : function (status) {
  223.                     status = status.split("\n");
  224.                     open("ws://" + status[0]);
  225.                 },
  226.                 dataType : "text",
  227.                 method : "POST",
  228.                 cache : false,
  229.                 crossDomain : true,
  230.                 data : dest || "?"
  231.             });
  232.         }
  233.         function after() {
  234.             $("#connecting").show();
  235.             next();
  236.         }
  237.         function open(url) {
  238.             //Verify existing connection.
  239.             if (ws) {
  240.                 ws.onopen = null;
  241.                 ws.onmessage = null;
  242.                 ws.onclose = null;
  243.                 ws.close();
  244.                 ws = null;
  245.             }
  246.             //Start new connection.
  247.             bucket = [];
  248.             playerCell = [];
  249.             nodes = {};
  250.             items = [];
  251.             destroyedCells = [];
  252.             leaderboardPlayers = [];
  253.             console.log("Connecting to " + url);
  254.             ws = new WebSocket(url);
  255.             ws.binaryType = "arraybuffer";
  256.             ws.onopen = listener;
  257.             ws.onmessage = parse;
  258.             ws.onclose = report;
  259.             ws.onerror = function () {
  260.                 console.log("socket error");
  261.             };
  262.         }
  263.         function listener(data) {
  264.             $("#connecting").hide();
  265.             console.log("socket open");
  266.             data = new ArrayBuffer(5);
  267.             var view = new DataView(data);
  268.             view.setUint8(0, 255);
  269.             view.setUint32(1, 1, true);
  270.             ws.send(data);
  271.             close();
  272.         }
  273.         function report(failing_message) {
  274.             console.log("socket close");
  275.             setTimeout(after, 500);
  276.         }
  277.         function parse(target) {
  278.             function encode() {
  279.                 var utftext = "";
  280.                 for (; ; ) {
  281.                     var c = d.getUint16(i, true);
  282.                     i += 2;
  283.                     if (0 == c) {
  284.                         break;
  285.                     }
  286.                     utftext += String.fromCharCode(c);
  287.                 }
  288.                 return utftext;
  289.             }
  290.             var i = 1;
  291.             var d = new DataView(target.data);
  292.             switch (d.getUint8(0)) {
  293.             case 16:
  294.                 //console.log("Code 16");
  295.                 run(d);
  296.                 break;
  297.             case 20:
  298.                 //Likely for when the server resets.
  299.                 console.log("Code 20");
  300.                 playerCell = [];
  301.                 bucket = [];
  302.                 break;
  303.             case 32:
  304.                 console.log("Code 32");
  305.                 bucket.push(d.getUint32(1, true));
  306.                 break;
  307.             case 48:
  308.                 console.log("Code 48");
  309.                 leaderboardPlayers = [];
  310.                 for (; i < d.byteLength; ) {
  311.                     tempName = encode();
  312.                     console.log("Name: " + tempName);
  313.                     leaderboardPlayers.push({
  314.                         id : 0,
  315.                         name : tempName
  316.                     });
  317.                 }
  318.                 drawLeaderboard();
  319.                 break;
  320.             case 49:
  321.                 //Parses the leaderboard.
  322.                 target = d.getUint32(i, true);
  323.                 i += 4;
  324.                 leaderboardPlayers = [];
  325.                 var seek = 0;
  326.                 for (; seek < target; ++seek) {
  327.                     var r = d.getUint32(i, true);
  328.                     i = i + 4;
  329.                     leaderboardPlayers.push({
  330.                         id : r,
  331.                         name : encode()
  332.                     });
  333.                 }
  334.                 drawLeaderboard();
  335.                 break;
  336.             case 64:
  337.                 console.log("Code 64");
  338.                 left = d.getFloat64(1, true);
  339.                 bottom = d.getFloat64(9, true);
  340.                 right = d.getFloat64(17, true);
  341.                 top = d.getFloat64(25, true);
  342.                 if (0 == playerCell.length) {
  343.                     cellX = (right + left) / 2;
  344.                     cellY = (top + bottom) / 2;
  345.                 };
  346.             }
  347.         }
  348.         function run(d) {
  349.            
  350.             e = +new Date;
  351.             var key = Math.random();
  352.             var offset = 1;
  353.             aa = false;
  354.  
  355.             var cellID = d.getUint16(offset, true);
  356.             offset = offset + 2;
  357.             var i = 0;
  358.             for (; i < cellID; ++i) {
  359.                 var current = nodes[d.getUint32(offset, true)];
  360.                 var that = nodes[d.getUint32(offset + 4, true)];
  361.                 offset = offset + 8;
  362.                 if (current) {
  363.                     if (that) {
  364.                         that.destroy();
  365.                         that.ox = that.x;
  366.                         that.oy = that.y;
  367.                         that.oSize = that.size;
  368.                         that.nx = current.x;
  369.                         that.ny = current.y;
  370.                         that.nSize = that.size;
  371.                         that.updateTime = e;
  372.                     }
  373.                 }
  374.             }
  375.             for (; ; ) {
  376.                 cellID = d.getUint32(offset, true);
  377.                 offset += 4;
  378.                 if (0 == cellID) {
  379.                     break;
  380.                 }
  381.                 i = d.getFloat64(offset, true);
  382.                 offset = offset + 8;
  383.                 current = d.getFloat64(offset, true);
  384.                 offset = offset + 8;
  385.                 that = d.getFloat64(offset, true);
  386.                 offset = offset + 8;
  387.                 var color = d.getUint8(offset++);
  388.                 var second = false;
  389.                 if (0 == color) {
  390.                     second = true;
  391.                     color = "#33FF33";
  392.                 } else {
  393.                     if (255 == color) {
  394.                         second = d.getUint8(offset++);
  395.                         color = d.getUint8(offset++);
  396.                         var cellName = d.getUint8(offset++);
  397.                         color = isArray(second << 16 | color << 8 | cellName);
  398.                         cellName = d.getUint8(offset++);
  399.                         second = !!(cellName & 1);
  400.                         if (cellName & 2) {
  401.                             offset += 4;
  402.                         }
  403.                         if (cellName & 4) {
  404.                             offset += 8;
  405.                         }
  406.                         if (cellName & 8) {
  407.                             offset += 16;
  408.                         }
  409.                     } else {
  410.                         color = 63487 | color << 16;
  411.                         var data = (color >> 16 & 255) / 255 * 360;
  412.                         var params = (color >> 8 & 255) / 255;
  413.                         color = (color >> 0 & 255) / 255;
  414.                         if (0 == params) {
  415.                             color = color << 16 | color << 8 | color << 0;
  416.                         } else {
  417.                             data = data / 60;
  418.                             cellName = ~~data;
  419.                             var callback = data - cellName;
  420.                             data = color * (1 - params);
  421.                             var tmp = color * (1 - params * callback);
  422.                             params = color * (1 - params * (1 - callback));
  423.                             var fn = callback = 0;
  424.                             var result = 0;
  425.                             switch (cellName % 6) {
  426.                             case 0:
  427.                                 callback = color;
  428.                                 fn = params;
  429.                                 result = data;
  430.                                 break;
  431.                             case 1:
  432.                                 callback = tmp;
  433.                                 fn = color;
  434.                                 result = data;
  435.                                 break;
  436.                             case 2:
  437.                                 callback = data;
  438.                                 fn = color;
  439.                                 result = params;
  440.                                 break;
  441.                             case 3:
  442.                                 callback = data;
  443.                                 fn = tmp;
  444.                                 result = color;
  445.                                 break;
  446.                             case 4:
  447.                                 callback = params;
  448.                                 fn = data;
  449.                                 result = color;
  450.                                 break;
  451.                             case 5:
  452.                                 callback = color;
  453.                                 fn = data;
  454.                                 result = tmp;
  455.                             }
  456.                             callback = ~~(255 * callback) & 255;
  457.                             fn = ~~(255 * fn) & 255;
  458.                             result = ~~(255 * result) & 255;
  459.                             color = callback << 16 | fn << 8 | result;
  460.                         }
  461.                         color = isArray(color);
  462.                     }
  463.                 }
  464.                 cellName = "";
  465.                 for (; ; ) {
  466.                     data = d.getUint16(offset, true);
  467.                     offset += 2;
  468.                     if (0 == data) {
  469.                         break;
  470.                     }
  471.                     cellName += String.fromCharCode(data);
  472.                 }
  473.                 var cellData = null;
  474.                 if (nodes.hasOwnProperty(cellID)) {
  475.                     cellData = nodes[cellID];
  476.                     cellData.updatePos();
  477.                     cellData.ox = cellData.x;
  478.                     cellData.oy = cellData.y;
  479.                     cellData.oSize = cellData.size;
  480.                     cellData.color = color;
  481.                     if (cellData.name != "") {
  482.                         //console.log("Text: " + cellData.name);
  483.                     }
  484.                 } else {
  485.                     cellData = new cell(cellID, i, current, that, color, second, cellName);
  486.                     cellData.pX = i;
  487.                     cellData.pY = current;
  488.                     if (cellName != "") {
  489.                         //console.log("Text: " + cellData.name + " Bool: " + second);
  490.                     }
  491.                 }
  492.                 cellData.nx = i;
  493.                 cellData.ny = current;
  494.                 cellData.nSize = that;
  495.                 cellData.updateCode = key;
  496.                 cellData.updateTime = e;
  497.                 if (-1 != bucket.indexOf(cellID)) {
  498.                     if (-1 == playerCell.indexOf(cellData)) {
  499.                         document.getElementById("overlays").style.display = "none";
  500.                         playerCell.push(cellData);
  501.                         if (1 == playerCell.length) {
  502.                             cellX = cellData.x;
  503.                             cellY = cellData.y;
  504.                         }
  505.                     }
  506.                 }
  507.             }
  508.             d.getUint16(offset, true);
  509.             offset += 2;
  510.             current = d.getUint32(offset, true);
  511.             offset += 4;
  512.             i = 0;
  513.             for (; i < current; i++) {
  514.                 cellID = d.getUint32(offset, true);
  515.                 offset += 4;
  516.                 if (nodes[cellID]) {
  517.                     nodes[cellID].updateCode = key;
  518.                 }
  519.             }
  520.             i = 0;
  521.             for (; i < items.length; i++) {
  522.                 if (items[i].updateCode != key) {
  523.                     items[i--].destroy();
  524.                 }
  525.             }
  526.             if (aa) {
  527.                 if (0 == playerCell.length) {
  528.                     $("#overlays").fadeIn(3E3);
  529.                     //window.connect("ws://45.33.48.113:443");
  530.                     setNick(originalName); // <---- TROLL hahaha
  531.                 }
  532.             }
  533.         }
  534.          
  535.         function computeDistance(x1, y1, x2, y2) {
  536.             var xdis = x1 - x2; // <--- FAKE ABS OF COURSE!
  537.             var ydis = y1 - y2;
  538.             var distance = Math.sqrt(Math.pow(xdis, 2)  + Math.pow(ydis, 2));
  539.            
  540.             return distance;
  541.         }
  542.        
  543.         function computerDistanceFromCircleEdge(x1, y1, x2, y2, s2) {
  544.             var tempD = computeDistance(x2, y2, x1, y1);
  545.            
  546.             var offsetX = 0;
  547.             var offsetY = 0;
  548.            
  549.             var ratioX =  tempD / (x2 - x1);
  550.             var ratioY =  tempD / (y2 - y1);
  551.  
  552.             offsetX = x2 - (s2 / ratioX);
  553.             offsetY = y2 - (s2 / ratioY);
  554.            
  555.             return computeDistance(x1, y1, offsetX, offsetY);
  556.         }
  557.        
  558.         function getListBasedOnFunction(booleanFunction, listToUse) {
  559.             var dotList = [];
  560.             Object.keys(listToUse).forEach(function (element, index) {
  561.                 if (booleanFunction(element)){
  562.                     dotList.push(nodes[element]);
  563.                 }
  564.             });
  565.            
  566.             return dotList;
  567.         }
  568.        
  569.         //TODO: Make it only go to a virus if it's big enough. If it shrinks, it shouldn't only grab a single dot and go back in.
  570.         function getAllNiceViruses() {
  571.             var dotList = [];
  572.            
  573.             if (playerCell.length == 1) {
  574.                 dotList = getListBasedOnFunction(function (element){
  575.                     if (nodes[element].isVirus && (nodes[element].size *1.10 <= playerCell[0].size) && nodes[element].size * 1.15 >= playerCell[0].size) {
  576.                             return true;
  577.                     }
  578.                     return false;
  579.                 }, nodes);
  580.             }
  581.  
  582.            
  583.             return dotList;
  584.         }
  585.  
  586.         function getAllThreats() {
  587.             var dotList = [];
  588.            
  589.             dotList = getListBasedOnFunction(function (element){
  590.                 var isMe = false;
  591.                
  592.                 for (var i = 0; i < playerCell.length; i++) {
  593.                     if (nodes[element].id == playerCell[i].id) {
  594.                         isMe = true;
  595.                         break;
  596.                     }
  597.                 }
  598.                
  599.                 for (var i = 0; i < playerCell.length; i++) {
  600.                     if (!isMe && (!nodes[element].isVirus && (nodes[element].size >= playerCell[i].oSize * 1.15))) {
  601.                         return true;
  602.                     } else if (nodes[element].isVirus && (nodes[element].size * 1.15 <= playerCell[i].oSize)) {
  603.                         return true;
  604.                     }
  605.                     return false;
  606.                 }
  607.             }, nodes);
  608.            
  609.             return dotList;
  610.         }
  611.        
  612.         function getAllFood() {
  613.             var elementList = [];
  614.             var dotList = [];
  615.            
  616.             elementList = getListBasedOnFunction(function (element){
  617.                 var isMe = false;
  618.                
  619.                 for (var i = 0; i < playerCell.length; i++) {
  620.                     if (nodes[element].id == playerCell[i].id) {
  621.                         isMe = true;
  622.                         break;
  623.                     }
  624.                 }
  625.                
  626.                 for (var i = 0; i < playerCell.length; i++) {
  627.                     if (!isMe && !nodes[element].isVirus && (nodes[element].size * 1.25 <= playerCell[i].size)  || (nodes[element].size <= 11)){return true;} else{return false;}
  628.                 }
  629.             }, nodes);
  630.            
  631.             for (var i = 0; i < elementList.length; i++) {
  632.                 dotList.push([elementList[i].x, elementList[i].y, elementList[i].size]);
  633.             }
  634.            
  635.             return dotList;
  636.         }
  637.        
  638.         function clusterFood(foodList, blobSize) {
  639.             var clusters = [];
  640.             var addedCluster = false;
  641.             for (var i = 0; i < foodList.length; i++) {
  642.                 for (var j = 0; j < clusters.length; j++) {
  643.                     if (computeDistance(foodList[i][0], foodList[i][1], clusters[j][0], clusters[j][1]) < blobSize * 1.5) {
  644.                         clusters[j][0] = (foodList[i][0] + clusters[j][0]) / 2;
  645.                         clusters[j][1] = (foodList[i][1] + clusters[j][1]) / 2;
  646.                         clusters[j][2] += foodList[i][2];
  647.                         addedCluster = true;
  648.                         break;
  649.                     }
  650.                 }
  651.                 if (!addedCluster) {
  652.                     clusters.push([foodList[i][0], foodList[i][1], foodList[i][2]]);
  653.                 }
  654.                 addedCluster = false;
  655.             }
  656.             return clusters;
  657.         }
  658.        
  659.         //Given two points on a line, finds the slope of a perpendicular line crossing it.
  660.         function inverseSlope(x1, y1, x2, y2) {
  661.             var m = (y1 - y2) / (x1 - x2);
  662.             return (-1) / m;
  663.         }
  664.        
  665.         //Given a slope and an offset, returns two points on that line.
  666.         function pointsOnLine(slope, useX, useY) {
  667.            
  668.             var b = useY - slope * useX;
  669.            
  670.             return [[useX - 100, slope * (useX - 100) + b], [useX + 100, slope * (useX + 100) + b]];
  671.         }
  672.        
  673.         //Using a line formed from point a to b, tells if point c is on left side of that line.
  674.         function isSideLine(a, b, c) {
  675.             if ((b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]) > 0) {
  676.                 return true;
  677.             }
  678.             return false;
  679.         }
  680.  
  681.         function findDestination() {
  682.             dPoints = [];
  683.             lines = [];
  684.            
  685.             var tempMoveX = moveX;
  686.             var tempMoveY = moveY;
  687.            
  688.             if (playerCell[0] != null) {
  689.                 var allPossibleFood = null;
  690.                 allPossibleFood = getAllFood(); // #1
  691.                
  692.                 /*for (var i = -1000; i < 1000; i += playerCell[0].size) {
  693.                     for (var j = -1000; j < 1000; j += playerCell[0].size) {
  694.                         allPossibleFood.push([playerCell[0].x + i, playerCell[0].y + j, -200]);
  695.                     }
  696.                 }*/
  697.                
  698.                 var allPossibleThreats = getAllThreats();
  699.                
  700.                 var allPossibleNiceViruses = getAllNiceViruses();
  701.                 var closestNiceViruse = null;
  702.                 if (allPossibleNiceViruses.length != 0) {
  703.                     closestNiceViruse = [allPossibleNiceViruses[0], computeDistance(allPossibleNiceViruses[0].x, allPossibleNiceViruses[0].y, playerCell[0].x, playerCell[0].y)];
  704.                
  705.                     for (var i = 1; i < allPossibleNiceViruses.length; i++) {
  706.                         var testD = computeDistance(allPossibleNiceViruses[i].x, allPossibleNiceViruses[i].y, playerCell[0].x, playerCell[0].y)
  707.                         if (testD < closestNiceViruse[1]) {
  708.                             closestNiceViruse = [allPossibleNiceViruses[i], testD];
  709.                         }
  710.                     }
  711.                    
  712.                     console.log("NO WAY!!! LET THE TROLLING BEGIN!");
  713.                 }
  714.                
  715.                 var allThreatLines = [];
  716.                 var allThreatLinesBool = [];
  717.                 var allFallbackPointsLeft = [];
  718.                 var allFallbackPointsRight = [];
  719.                 var allFallbackBool = [];
  720.                 var allFallbackCount = [];
  721.                
  722.                 var closestThreatIndex = null;
  723.                 var closestThreatD = null;
  724.                 var closestThreatIndex2 = null;
  725.                 var closestThreatD2 = null;
  726.                
  727.                 var isSafeSpot = true;
  728.                
  729.                 var clusterAllFood = clusterFood(allPossibleFood, playerCell[0].oSize);
  730.                
  731.                 for (var i = 0; i < allPossibleThreats.length; i++) {
  732.                    
  733.                     var tempD = computerDistanceFromCircleEdge(playerCell[0].x, playerCell[0].y, allPossibleThreats[i].x, allPossibleThreats[i].y, allPossibleThreats[i].size);
  734.                    
  735.                     if (closestThreatIndex != null) {
  736.                         if (closestThreatD > tempD) {
  737.                             closestThreatIndex2 = closestThreatIndex;
  738.                             closestThreatD2 = closestThreatD;
  739.                             closestThreatIndex = i;
  740.                             closestThreatD = tempD;
  741.                         }
  742.                     } else {
  743.                         closestThreatIndex = i;
  744.                         closestThreatD = tempD;
  745.                     }
  746.                    
  747.                     var ratioX =  tempD / (allPossibleThreats[i].x - playerCell[0].x);
  748.                     var ratioY =  tempD / (allPossibleThreats[i].y - playerCell[0].y);
  749.                    
  750.                     var offsetX = 0;
  751.                     var offsetY = 0;
  752.                    
  753.                     var offsetEscapeX = 0;
  754.                     var offsetEscapeY = 0;
  755.                    
  756.                     var offsetLeftX = 0;
  757.                     var offsetLeftY = 0;
  758.  
  759.                     var offsetRightX = 0;
  760.                     var offsetRightY = 0;
  761.                    
  762.                     var offsetEscapeLeftX = 0;
  763.                     var offsetEscapeLeftY = 0;
  764.  
  765.                     var offsetEscapeRightX = 0;
  766.                     var offsetEscapeRightY = 0;
  767.                    
  768.                     var escape = 5;
  769.                     var escapeMid = 3;
  770.                    
  771.                     iSlope = inverseSlope(allPossibleThreats[i].x, allPossibleThreats[i].y, playerCell[0].x, playerCell[0].y);
  772.                    
  773.                     var sidePoints = pointsOnLine(iSlope, allPossibleThreats[i].x, allPossibleThreats[i].y);
  774.                    
  775.                     var leftD = computeDistance(allPossibleThreats[i].x, allPossibleThreats[i].y, sidePoints[0][0], sidePoints[0][1]);
  776.  
  777.                     var ratioLeftX = leftD / (allPossibleThreats[i].x - sidePoints[0][0]);
  778.                     var ratioLeftY = leftD / (allPossibleThreats[i].y - sidePoints[0][1]);
  779.                    
  780.                     if (allPossibleThreats[i].size >= playerCell[0].size * 4) {
  781.                         offsetX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioX * 1.5);
  782.                         offsetY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioY * 1.5);
  783.                        
  784.                         offsetLeftX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioLeftX * 3);
  785.                         offsetLeftY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioLeftY * 3);
  786.                        
  787.                         offsetRightX = allPossibleThreats[i].x + (allPossibleThreats[i].size / ratioLeftX * 3);
  788.                         offsetRightY = allPossibleThreats[i].y + (allPossibleThreats[i].size / ratioLeftY * 3);
  789.                        
  790.                         offsetEscapeX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioX * escape);
  791.                         offsetEscapeY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioY * escape);
  792.                        
  793.                         offsetEscapeLeftX = offsetEscapeX - (allPossibleThreats[i].size / ratioLeftX * escapeMid);
  794.                         offsetEscapeLeftY = offsetEscapeY - (allPossibleThreats[i].size / ratioLeftY * escapeMid);
  795.  
  796.                         offsetEscapeRightX = offsetEscapeX + (allPossibleThreats[i].size / ratioLeftX * escapeMid);
  797.                         offsetEscapeRightY = offsetEscapeY + (allPossibleThreats[i].size / ratioLeftY * escapeMid);
  798.                        
  799.                     } else if (allPossibleThreats[i].size >= playerCell[0].size * 2.1) {
  800.                         offsetX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioX * 4);
  801.                         offsetY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioY * 4);
  802.                        
  803.                         offsetLeftX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioLeftX * 4);
  804.                         offsetLeftY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioLeftY * 4);
  805.                        
  806.                         offsetRightX = allPossibleThreats[i].x + (allPossibleThreats[i].size / ratioLeftX * 4);
  807.                         offsetRightY = allPossibleThreats[i].y + (allPossibleThreats[i].size / ratioLeftY * 4);
  808.                        
  809.                         offsetEscapeX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioX * escape);
  810.                         offsetEscapeY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioY * escape);
  811.                        
  812.                         offsetEscapeLeftX = offsetEscapeX - (allPossibleThreats[i].size / ratioLeftX * escapeMid);
  813.                         offsetEscapeLeftY = offsetEscapeY - (allPossibleThreats[i].size / ratioLeftY * escapeMid);
  814.  
  815.                         offsetEscapeRightX = offsetEscapeX + (allPossibleThreats[i].size / ratioLeftX * escapeMid);
  816.                         offsetEscapeRightY = offsetEscapeY + (allPossibleThreats[i].size / ratioLeftY * escapeMid);
  817.                     } else {
  818.                         offsetX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioX * 1);
  819.                         offsetY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioY * 1);
  820.                        
  821.                         offsetLeftX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioLeftX * 3);
  822.                         offsetLeftY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioLeftY * 3);
  823.                        
  824.                         offsetRightX = allPossibleThreats[i].x + (allPossibleThreats[i].size / ratioLeftX * 3);
  825.                         offsetRightY = allPossibleThreats[i].y + (allPossibleThreats[i].size / ratioLeftY * 3);
  826.                        
  827.                         offsetEscapeX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioX * escape);
  828.                         offsetEscapeY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioY * escape);
  829.                        
  830.                         offsetEscapeLeftX = offsetEscapeX - (allPossibleThreats[i].size / ratioLeftX * escapeMid);
  831.                         offsetEscapeLeftY = offsetEscapeY - (allPossibleThreats[i].size / ratioLeftY * escapeMid);
  832.  
  833.                         offsetEscapeRightX = offsetEscapeX + (allPossibleThreats[i].size / ratioLeftX * escapeMid);
  834.                         offsetEscapeRightY = offsetEscapeY + (allPossibleThreats[i].size / ratioLeftY * escapeMid);
  835.                     }
  836.                    
  837.                     if (playerCell[0].x < allPossibleThreats[i].x && playerCell[0].y > allPossibleThreats[i].y) {
  838.                         var c = offsetRightX;
  839.                         offsetRightX = offsetLeftX;
  840.                         offsetLeftX = c;
  841.  
  842.                         var d = offsetRightY;
  843.                         offsetRightY = offsetLeftY;
  844.                         offsetLeftY = d;
  845.                        
  846.                         var e = offsetEscapeRightX;
  847.                         offsetEscapeRightX = offsetEscapeLeftX;
  848.                         offsetEscapeLeftX = e;
  849.  
  850.                         var f = offsetEscapeRightY;
  851.                         offsetEscapeRightY = offsetEscapeLeftY;
  852.                         offsetEscapeLeftY = f;
  853.                         //console.log("Swap");
  854.                     } else if (playerCell[0].x > allPossibleThreats[i].x && playerCell[0].y > allPossibleThreats[i].y)
  855.                     {
  856.                         var c = offsetRightX;
  857.                         offsetRightX = offsetLeftX;
  858.                         offsetLeftX = c;
  859.  
  860.                         var d = offsetRightY;
  861.                         offsetRightY = offsetLeftY;
  862.                         offsetLeftY = d;
  863.                        
  864.                         var e = offsetEscapeRightX;
  865.                         offsetEscapeRightX = offsetEscapeLeftX;
  866.                         offsetEscapeLeftX = e;
  867.  
  868.                         var f = offsetEscapeRightY;
  869.                         offsetEscapeRightY = offsetEscapeLeftY;
  870.                         offsetEscapeLeftY = f;
  871.                         //console.log("Swap");
  872.                     }
  873.                    
  874.                     //offsetX = ((allPossibleThreats[i].x + playerCell[0].x) / 2);
  875.                     //offsetY = ((allPossibleThreats[i].y + playerCell[0].y) / 2);
  876.  
  877.                     drawPoint(offsetX, offsetY, 2);
  878.                    
  879.                     drawPoint(offsetLeftX, offsetLeftY, 3);
  880.                     drawPoint(offsetRightX, offsetRightY, 3);
  881.                    
  882.                     var leftSlope = inverseSlope(allPossibleThreats[i].x, allPossibleThreats[i].y, sidePoints[0][0], sidePoints[0][1]);
  883.                    
  884.                     threatLineLeft = [[offsetLeftX, offsetLeftY], [offsetX, offsetY]];
  885.                     threatLineRight = [[offsetRightX, offsetRightY], [offsetX, offsetY]];
  886.                    
  887.                     threatLine = pointsOnLine(iSlope, offsetX, offsetY);
  888.                    
  889.                     drawLine(allPossibleThreats[i].x, allPossibleThreats[i].y, playerCell[0].x, playerCell[0].y, 3);
  890.                    
  891.                     //drawLine(threatLine[0][0], threatLine[0][1], threatLine[1][0], threatLine[1][1], 0);
  892.                    
  893.                     drawLine(threatLineLeft[0][0], threatLineLeft[0][1], threatLineLeft[1][0], threatLineLeft[1][1], 0);
  894.                     drawLine(threatLineRight[0][0], threatLineRight[0][1], threatLineRight[1][0], threatLineRight[1][1], 0);
  895.                    
  896.                     allThreatLines.push([threatLineLeft, threatLineRight]);
  897.                    
  898.                     drawPoint(offsetEscapeLeftX, offsetEscapeLeftY, 4);
  899.                     drawPoint(offsetEscapeRightX, offsetEscapeRightY, 4);
  900.                     //drawPoint(offsetEscapeX, offsetEscapeY, 4);
  901.                    
  902.                     //allFallbackPoints.push([offsetEscapeX, offsetEscapeY]);
  903.                     allFallbackPointsLeft.push([offsetEscapeLeftX, offsetEscapeLeftY]);
  904.                     allFallbackPointsRight.push([offsetEscapeRightX, offsetEscapeRightY]);
  905.                     //allFallbackPoints.push([offsetEscapeRightX, offsetEscapeRightY]);
  906.                    
  907.                     allFallbackBool.push(true);
  908.                     //allFallbackBool.push(true);
  909.                    
  910.                     allFallbackCount.push(0);
  911.                     //allFallbackCount.push(0);
  912.                    
  913.                     var badSide = isSideLine(threatLine[0], threatLine[1], [allPossibleThreats[i].x, allPossibleThreats[i].y]);
  914.                    
  915.                     var badSideLeft = isSideLine(threatLineLeft[0], threatLineLeft[1], [allPossibleThreats[i].x, allPossibleThreats[i].y]);
  916.                     var badSideRight = isSideLine(threatLineRight[0], threatLineRight[1], [allPossibleThreats[i].x, allPossibleThreats[i].y]);
  917.                    
  918.                     allThreatLinesBool.push([badSideLeft, badSideRight]);
  919.                    
  920.                     isSafeSpot = (
  921.                             badSideLeft != isSideLine(threatLineLeft[0], threatLineLeft[1], [playerCell[0].x, playerCell[0].y]) &&
  922.                             badSideRight != isSideLine(threatLineRight[0], threatLineRight[1], [playerCell[0].x, playerCell[0].y]) && isSafeSpot
  923.                     );
  924.                    
  925.                     var removeClusterList = [];
  926.                    
  927.                     for (var j = 0; j < clusterAllFood.length; j++) {
  928.                         if (
  929.                             badSideLeft == isSideLine(threatLineLeft[0], threatLineLeft[1], [clusterAllFood[j][0], clusterAllFood[j][1]]) &&
  930.                             badSideRight == isSideLine(threatLineRight[0], threatLineRight[1], [clusterAllFood[j][0], clusterAllFood[j][1]])
  931.                         ) {
  932.                             removeClusterList.push(j);
  933.                         }
  934.                     }
  935.                     for (var j = removeClusterList.length - 1; j >= 0; j--) {
  936.                         if (!toggle) {
  937.                             drawPoint(clusterAllFood[j][0], clusterAllFood[j][1], 0);
  938.                         }
  939.                         clusterAllFood.splice(removeClusterList[j], 1);
  940.                     }
  941.                    
  942.                     if (
  943.                         badSideLeft == isSideLine(threatLineLeft[0], threatLineLeft[1], [tempPoint[0], tempPoint[1]]) &&
  944.                         badSideRight == isSideLine(threatLineRight[0], threatLineRight[1], [tempPoint[0], tempPoint[1]])
  945.                     ) {
  946.                         tempPoint[2] = 0;
  947.                     }
  948.                 }
  949.                
  950.                 for (var i = 0; i < clusterAllFood.length; i++) {
  951.                     //console.log("Before: " + clusterAllFood[i][2]);
  952.                     clusterAllFood[i][2] = clusterAllFood[i][2] * 6 - computeDistance(clusterAllFood[i][0], clusterAllFood[i][1], playerCell[0].ox, playerCell[0].oy);
  953.                     if (!toggle) {
  954.                         drawPoint(clusterAllFood[i][0], clusterAllFood[i][1], 1);
  955.                     }
  956.                     //console.log("After: " + clusterAllFood[i][2]);
  957.                 }
  958.                
  959.                 if (clusterAllFood.length != 0 && isSafeSpot) {
  960.                     biggestCluster = clusterAllFood[0];
  961.                     for (var i = 1; i < clusterAllFood.length; i++) {
  962.                         if (clusterAllFood[i][2] > biggestCluster[2]) {
  963.                             biggestCluster = clusterAllFood[i];
  964.                         }
  965.                     }
  966.                    
  967.                     /**
  968.                      * #1 Get a list of all the food.
  969.                      * #2 Get a list of all the threats.
  970.                      * #3 Remove all the food near threats.
  971.                      * #4 Find closest food after the filter.
  972.                      */
  973.                    
  974.                     if (closestNiceViruse != null && closestNiceViruse[0].size * 1.15 <= playerCell[0].size) {
  975.                         for (var i = 0; i < playerCell.length; i++) {
  976.                             drawLine(playerCell[i].ox, playerCell[i].oy, closestNiceViruse[0].x, closestNiceViruse[0].y, 5);
  977.                         }
  978.                        
  979.                         virusBait = true;
  980.          
  981.                         tempMoveX = closestNiceViruse[0].x;
  982.                         tempMoveY = closestNiceViruse[0].y;
  983.                     } else {
  984.                         for (var i = 0; i < playerCell.length; i++) {
  985.                             drawLine(playerCell[i].ox, playerCell[i].oy, biggestCluster[0], biggestCluster[1], 1);
  986.                         }
  987.                        
  988.                         virusBait = false;
  989.          
  990.                         tempMoveX = biggestCluster[0];
  991.                         tempMoveY = biggestCluster[1];
  992.                         console.log("Moving");
  993.                     }
  994.                    
  995.                     //console.log("X: " + moveX + " Y: " + moveY);
  996.                    
  997.                     if (playerCell.length > 1 && splitted) {
  998.                         splitted = false;
  999.                         tempMoveX = biggestCluster[0];
  1000.                         tempMoveY = biggestCluster[1];
  1001.                     }
  1002.                     if (splitting) {
  1003.                         tempMoveX = biggestCluster[0];
  1004.                         tempMoveY = biggestCluster[1];
  1005.                         sendServerCommand(17);
  1006.                         splitting = false;
  1007.                         splitted = true;
  1008.                     }
  1009.                    
  1010.                     if (biggestCluster[2] * 2.5 < playerCell[0].size && biggestCluster[2] > playerCell[0].size / 5 &&  biggestCluster[2] > 11 && !splitted && !splitting) {
  1011.                         drawLine(playerCell[0].x, playerCell[0].y, biggestCluster[0], biggestCluster[1], 4);
  1012.                        
  1013.                         var worthyTargetDistance = computeDistance(playerCell[0].x, playerCell[0].y, biggestCluster[0], biggestCluster[1]);
  1014.                        
  1015.                         console.log("I want to split.");
  1016.                        
  1017.                         if ((worthyTargetDistance < playerCell[0].size * 3) && playerCell.length == 1) {
  1018.                             tempMoveX = biggestCluster[0];
  1019.                             tempMoveY = biggestCluster[1];
  1020.                             splitting = true;
  1021.                         }
  1022.                     }
  1023.                 } else if (!virusBait) {
  1024.                     //console.log("I'm lost, where do I go?");
  1025.                    
  1026.                     /*if (closestThreatIndex2 != null) {
  1027.                         if (allPossibleThreats[closestThreatIndex].x < allPossibleThreats[closestThreatIndex2].x && allPossibleThreats[closestThreatIndex].y < allPossibleThreats[closestThreatIndex2].y) {
  1028.                             tempMoveX = allFallbackPointsLeft[closestThreatIndex][0];
  1029.                             tempMoveY = allFallbackPointsLeft[closestThreatIndex][1];
  1030.                         } else if (allPossibleThreats[closestThreatIndex].x > allPossibleThreats[closestThreatIndex2].x && allPossibleThreats[closestThreatIndex].y < allPossibleThreats[closestThreatIndex2].y) {
  1031.                             tempMoveX = allFallbackPointsRight[closestThreatIndex][0];
  1032.                             tempMoveY = allFallbackPointsRight[closestThreatIndex][1];
  1033.                         } else if (allPossibleThreats[closestThreatIndex].x < allPossibleThreats[closestThreatIndex2].x && allPossibleThreats[closestThreatIndex].y > allPossibleThreats[closestThreatIndex2].y) {
  1034.                             tempMoveX = allFallbackPointsRight[closestThreatIndex][0];
  1035.                             tempMoveY = allFallbackPointsRight[closestThreatIndex][1];
  1036.                         } else if (allPossibleThreats[closestThreatIndex].x > allPossibleThreats[closestThreatIndex2].x && allPossibleThreats[closestThreatIndex].y > allPossibleThreats[closestThreatIndex2].y) {
  1037.                             tempMoveX = allFallbackPointsLeft[closestThreatIndex][0];
  1038.                             tempMoveY = allFallbackPointsLeft[closestThreatIndex][1];
  1039.                         } else {
  1040.                             console.log("Hmm, WTF!!!");
  1041.                         }
  1042.                     } else {
  1043.                         tempMoveX = allFallbackPointsLeft[closestThreatIndex][0];
  1044.                         tempMoveY = allFallbackPointsLeft[closestThreatIndex][1];
  1045.                     }*/
  1046.                     tempMoveX = allFallbackPointsLeft[closestThreatIndex][0];
  1047.                     tempMoveY = allFallbackPointsLeft[closestThreatIndex][1];
  1048.                    
  1049.                     if (tempMoveX < left || tempMoveX > right) {
  1050.                         tempMoveX = allFallbackPointsRight[closestThreatIndex][0];
  1051.                         tempMoveY = allFallbackPointsRight[closestThreatIndex][1];
  1052.                     } else if (tempMoveX < bottom || tempMoveX > top) {
  1053.                         tempMoveX = allFallbackPointsRight[closestThreatIndex][0];
  1054.                         tempMoveY = allFallbackPointsRight[closestThreatIndex][1];
  1055.                     }
  1056.                    
  1057.                    
  1058.                     drawLine(playerCell[0].x, playerCell[0].y, tempMoveX, tempMoveY, 6);
  1059.                     //#1 Find closest enemy.
  1060.                     //#2 go to its teal line.
  1061.                    
  1062.                     /*for (var i = 0; i < allFallbackPoints.length; i++) {
  1063.                         for (var j = 0; j < allThreatLines.length; j++) {
  1064.                             var badSideLeft = allThreatLinesBool[0];
  1065.                             var badSideRight = allThreatLinesBool[1];
  1066.                            
  1067.                             if (allFallbackBool[i] &&
  1068.                                 badSideLeft != isSideLine(allThreatLines[j][0][0], allThreatLines[j][0][1], allFallbackPoints[i]) &&
  1069.                                 badSideRight != isSideLine(allThreatLines[j][1][0], allThreatLines[j][1][1], allFallbackPoints[i])
  1070.                             ) {
  1071.                                 allFallbackBool[i] = true;
  1072.                                 //console.log("Step 1");
  1073.                             } else {
  1074.                                 //console.log("Failed Step 1");
  1075.                                 allFallbackBool[i] = false;
  1076.                                 allFallbackCount[i] += 1;
  1077.                             }
  1078.                         }
  1079.                        
  1080.  
  1081.                     }
  1082.                    
  1083.                     var closestFallback = null;
  1084.                     var fallbackDistance = null;
  1085.                     for (var i = 1; i < allFallbackPoints.length; i++) {
  1086.                         if (allFallbackBool[i]) {
  1087.                             var tempDistance = computeDistance(playerCell[0].x, playerCell[0].y, allFallbackPoints[i][0], allFallbackPoints[i][1]);
  1088.                             if (closestFallback != null) {
  1089.                                 if (tempDistance < fallbackDistance) {
  1090.                                     closestFallback = allFallbackPoints[i];
  1091.                                     fallbackDistance = tempDistance;
  1092.                                 }
  1093.                             } else {
  1094.                                 //console.log("FOUND CHILL SPOT!");
  1095.                                 closestFallback = allFallbackPoints[i];
  1096.                                 fallbackDistance = tempDistance;
  1097.                             }
  1098.                         }
  1099.                     }
  1100.                    
  1101.                     if (closestFallback != null) {
  1102.                         console.log("ESCAPING");
  1103.                         tempMoveX = closestFallback[0];
  1104.                         tempMoveY = closestFallback[1];
  1105.                         drawLine(playerCell[0].x, playerCell[0].y, tempMoveX, tempMoveY, 6);
  1106.                     } else {
  1107.                         console.log("NOPE! NEVER RUNNING AWAY!");
  1108.                     }*/
  1109.                    
  1110.                     //#1 Loop through fallbackpoints
  1111.                     //#2 Loop through threatlines
  1112.                     //#3 Verify if a point is fine. If not, add counter to point's overlaps
  1113.                     //#4 Go to closest safe point, otherwise find point with lowest counter.
  1114.                 }
  1115.                
  1116.                 drawPoint(tempPoint[0], tempPoint[1], tempPoint[2]);
  1117.                 tempPoint[2] = 1;
  1118.             }
  1119.            
  1120.             if (!toggle) {
  1121.                 moveX = tempMoveX;
  1122.                 moveY = tempMoveY;
  1123.             }
  1124.         }
  1125.  
  1126.         function drawPoint(x_1, y_1, drawColor) {
  1127.             if (!toggleDraw) {
  1128.                 var x1 = ((x_1 - cellX) * screenRatio) + width/2;
  1129.                 var y1 = ((y_1 - cellY) * screenRatio) + height/2;
  1130.                
  1131.                 //console.log("\tdX: " + x1 + " dY: " + y1);
  1132.                
  1133.                 dPoints.push([x1, y1, drawColor]);
  1134.             }
  1135.         }
  1136.        
  1137.         function drawLine(x_1, y_1, x_2, y_2, drawColor) {
  1138.             if (!toggleDraw) {
  1139.                 var x1 = ((x_1 - cellX) * screenRatio) + width/2;
  1140.                 var y1 = ((y_1 - cellY) * screenRatio) + height/2;
  1141.                 var x2 = ((x_2 - cellX) * screenRatio) + width/2;
  1142.                 var y2 = ((y_2 - cellY) * screenRatio) + height/2;
  1143.                 lines.push([x1, y1, x2, y2, drawColor]);
  1144.             }
  1145.         }
  1146.        
  1147.         function sendMovementToServer() { //Sends server mouse position or movement
  1148.             //console.log("Nodes Length: " + Object.keys(nodes).length);
  1149.             findDestination();
  1150.            
  1151.             if (null != ws && ws.readyState == ws.OPEN) {
  1152.                 var z0 = currentMouseX - width / 2; //z0 and z1 are mouse position relative to the player cell
  1153.                 var z1 = currentMouseY - height / 2;
  1154.                 if (!(64 > z0 * z0 + z1 * z1)) { //To keep ball still if the mouse position is in the center of the ball
  1155.                     if (!(val == moveX && min == moveY)) {
  1156.                         val = moveX;
  1157.                         min = moveY;
  1158.                         z0 = new ArrayBuffer(21);
  1159.                         z1 = new DataView(z0);
  1160.                         z1.setUint8(0, 16);
  1161.                         z1.setFloat64(1, moveX, true);
  1162.                         z1.setFloat64(9, moveY, true);
  1163.                         z1.setUint32(17, 0, true);
  1164.                         ws.send(z0);
  1165.                     }
  1166.                 }
  1167.             }
  1168.         }
  1169.         function close() {
  1170.             if (null != ws && (ws.readyState == ws.OPEN && null != result)) {
  1171.                 var buf = new ArrayBuffer(1 + 2 * result.length);
  1172.                 var view = new DataView(buf);
  1173.                 view.setUint8(0, 0);
  1174.                 var i = 0;
  1175.                 for (; i < result.length; ++i) {
  1176.                     view.setUint16(1 + 2 * i, result.charCodeAt(i), true);
  1177.                 }
  1178.                 ws.send(buf);
  1179.             }
  1180.         }
  1181.         function sendServerCommand(opt_attributes) { //opt_attributes appears to be a server-side command, I don't know what the exact details are
  1182.             if (null != ws && ws.readyState == ws.OPEN) {
  1183.                 /** @type {ArrayBuffer} */
  1184.                 var buf = new ArrayBuffer(1);
  1185.                 (new DataView(buf)).setUint8(0, opt_attributes);
  1186.                 ws.send(buf);
  1187.             }
  1188.         }
  1189.         function anim() {
  1190.            
  1191.             draw();
  1192.             self.requestAnimationFrame(anim);
  1193.         }
  1194.         /**
  1195.          * @return {undefined}
  1196.          */
  1197.         function onResize() {
  1198.             width = self.innerWidth;
  1199.             height = self.innerHeight;
  1200.             tempCanvas.width = canvas.width = width;
  1201.             tempCanvas.height = canvas.height = height;
  1202.             draw();
  1203.         }
  1204.         /**
  1205.          * @return {undefined}
  1206.          */
  1207.         function calculateScreenRatio() {
  1208.             if (0 != playerCell.length) {
  1209.                 var offset = zoom;
  1210.                 var fileIndex = 0;
  1211.                 for (; fileIndex < playerCell.length; fileIndex++) {
  1212.                     offset += playerCell[fileIndex].size;
  1213.                 }
  1214.                 offset = Math.pow(Math.min(64 / offset, 1), 0.4) * Math.max(height / (970), width / (1920));
  1215.                 screenRatio = (9 * screenRatio + offset) / 10; //Ratio is used to scale the ball size based on screen size, so that you can still see pretty much the same amount no matter how big your screen is
  1216.             }
  1217.         }
  1218.         /**
  1219.          * @return {undefined}
  1220.          */
  1221.         function draw() {
  1222.            
  1223.             var tick = +new Date;
  1224.             ++Ba;
  1225.             calculateScreenRatio();
  1226.             e = +new Date;
  1227.             if (0 < playerCell.length) {
  1228.                 var w = 0;
  1229.                 var d = 0;
  1230.                 var i = 0;
  1231.                 for (; i < playerCell.length; i++) {
  1232.                     playerCell[i].updatePos();
  1233.                     w += playerCell[i].x / playerCell.length;
  1234.                     d += playerCell[i].y / playerCell.length;
  1235.                 }
  1236.                 cellX = (cellX + w) / 2;
  1237.                 cellY = (cellY + d) / 2;
  1238.             }
  1239.             processData();
  1240.             recalculateDestination();
  1241.             canvasContext.clearRect(0, 0, width, height);
  1242.             canvasContext.fillStyle = color ? "#111111" : "#F2FBFF";
  1243.             canvasContext.fillRect(0, 0, width, height);
  1244.             canvasContext.save();
  1245.             canvasContext.strokeStyle = color ? "#AAAAAA" : "#000000";
  1246.             canvasContext.globalAlpha = 0.2;
  1247.             canvasContext.scale(screenRatio, screenRatio);
  1248.             w = width / screenRatio;
  1249.             d = height / screenRatio;
  1250.             i = -0.5 + (-cellX + w / 2) % 50;
  1251.             for (; i < w; i += 50) { //Draw grid lines vertical
  1252.                 canvasContext.beginPath();
  1253.                 canvasContext.moveTo(i, 0);
  1254.                 canvasContext.lineTo(i, d);
  1255.                 canvasContext.stroke();
  1256.             }
  1257.             i = -0.5 + (-cellY + d / 2) % 50;
  1258.             for (; i < d; i += 50) { //Draw grid lines horizontal
  1259.                 canvasContext.beginPath();
  1260.                 canvasContext.moveTo(0, i);
  1261.                 canvasContext.lineTo(w, i);
  1262.                 canvasContext.stroke();
  1263.             }
  1264.             canvasContext.restore();
  1265.             items.sort(function (a, b) {
  1266.                 return a.size == b.size ? a.id - b.id : a.size - b.size;
  1267.             });
  1268.             canvasContext.save();
  1269.             canvasContext.translate(width / 2, height / 2);
  1270.             canvasContext.scale(screenRatio, screenRatio);
  1271.             canvasContext.translate(-cellX, -cellY);
  1272.             i = 0;
  1273.             for (; i < destroyedCells.length; i++) {
  1274.                 destroyedCells[i].draw();
  1275.             }
  1276.             i = 0;
  1277.             for (; i < items.length; i++) {
  1278.                 items[i].draw();
  1279.             }
  1280.             canvasContext.restore();
  1281.             if (img) {
  1282.                 if (0 != leaderboardPlayers.length) {
  1283.  
  1284.                     canvasContext.drawImage(img, width - img.width - 10, 10);
  1285.                 }
  1286.             }
  1287.             closingAnimationTime = Math.max(closingAnimationTime, getHeight());
  1288.             if (0 != closingAnimationTime) {
  1289.                 if (null == button) {
  1290.                     button = new SVGPlotFunction(24, "#FFFFFF");
  1291.                 }
  1292.                 button.setValue("Score: " + ~~(closingAnimationTime / 100));
  1293.                 d = button.render();
  1294.                 w = d.width;
  1295.                 canvasContext.globalAlpha = 0.2;
  1296.                 /** @type {string} */
  1297.                 canvasContext.fillStyle = "#000000";
  1298.                 canvasContext.fillRect(10, height - 10 - 24 - 10, w + 10, 34);
  1299.                 canvasContext.globalAlpha = 1;
  1300.                 canvasContext.drawImage(d, 15, height - 10 - 24 - 5);
  1301.             }
  1302.             clear();
  1303.             tick = +new Date - tick;
  1304.             if (tick > 1E3 / 60) {
  1305.                 n_players -= 0.01;
  1306.             } else {
  1307.                 if (tick < 1E3 / 65) {
  1308.                     n_players += 0.01;
  1309.                 }
  1310.             }
  1311.             if (0.4 > n_players) {
  1312.                 n_players = 0.4;
  1313.             }
  1314.             if (1 < n_players) {
  1315.                 n_players = 1;
  1316.             }
  1317.            
  1318.             for (var i = 0; i < dPoints.length; i++) {
  1319.                 var radius = 10;
  1320.  
  1321.                 canvasContext.beginPath();
  1322.                 canvasContext.arc(dPoints[i][0], dPoints[i][1], radius, 0, 2 * Math.PI, false);
  1323.  
  1324.                 if (dPoints[i][2] == 0) {
  1325.                     canvasContext.fillStyle = "black";
  1326.                 } else if (dPoints[i][2] == 1) {
  1327.                     canvasContext.fillStyle = "yellow";
  1328.                 } else if (dPoints[i][2] == 2) {
  1329.                     canvasContext.fillStyle = "blue";
  1330.                 } else if (dPoints[i][2] == 3) {
  1331.                     canvasContext.fillStyle = "red";
  1332.                 } else if (dPoints[i][2] == 4) {
  1333.                     canvasContext.fillStyle = "#008080";
  1334.                 } else {
  1335.                     canvasContext.fillStyle = "#000000";
  1336.                 }
  1337.                  
  1338.                 canvasContext.fill();
  1339.                 canvasContext.lineWidth = 2;
  1340.                 canvasContext.strokeStyle = '#003300';
  1341.                 canvasContext.stroke();
  1342.             }
  1343.             canvasContext.lineWidth = 1;
  1344.            
  1345.             for(var i = 0; i < lines.length; i++) {
  1346.                
  1347.                 canvasContext.beginPath();
  1348.                
  1349.                 canvasContext.lineWidth = 5;
  1350.                
  1351.                 if (lines[i][4] == 0) {
  1352.                     canvasContext.strokeStyle = "#FF0000";
  1353.                 } else if (lines[i][4] == 1) {
  1354.                     canvasContext.strokeStyle = "#00FF00";
  1355.                 } else if (lines[i][4] == 2) {
  1356.                     canvasContext.strokeStyle = "#0000FF";
  1357.                 } else if (lines[i][4] == 3) {
  1358.                     canvasContext.strokeStyle = "#FF8000";
  1359.                 } else if (lines[i][4] == 4) {
  1360.                     canvasContext.strokeStyle = "#8A2BE2";
  1361.                 } else if (lines[i][4] == 5) {
  1362.                     canvasContext.strokeStyle = "#FF69B4";
  1363.                 } else if (lines[i][4] == 6) {
  1364.                     canvasContext.strokeStyle = "#008080";
  1365.                 } else {
  1366.                     canvasContext.strokeStyle = "#000000";
  1367.                 }
  1368.                
  1369.                 canvasContext.moveTo(lines[i][0], lines[i][1]);
  1370.                 canvasContext.lineTo(lines[i][2], lines[i][3]);
  1371.                
  1372.                 canvasContext.stroke();
  1373.             }
  1374.             canvasContext.lineWidth = 1;
  1375.         }
  1376.         /**
  1377.          * @return {undefined}
  1378.          */
  1379.         function clear() {
  1380.             if (options && skin_image.width) {
  1381.                 var dim = width / 5;
  1382.                 canvasContext.drawImage(skin_image, 5, 5, dim, dim);
  1383.             }
  1384.         }
  1385.         /**
  1386.          * @return {?}
  1387.          */
  1388.         function getHeight() {
  1389.             var value = 0;
  1390.             var second = 0;
  1391.             for (; second < playerCell.length; second++) {
  1392.                 value += playerCell[second].nSize * playerCell[second].nSize;
  1393.             }
  1394.             return value;
  1395.         }
  1396.         function drawLeaderboard() {
  1397.             if (0 != leaderboardPlayers.length) {
  1398.                 if (v) {
  1399.                     img = document.createElement("canvas");
  1400.                     var canvasContext = img.getContext("2d");
  1401.                     var s = 60 + 24 * leaderboardPlayers.length;
  1402.                     var n = Math.min(200, 0.3 * width) / 200;
  1403.                     img.width = 200 * n;
  1404.                     img.height = s * n;
  1405.                     canvasContext.scale(n, n);
  1406.                     canvasContext.globalAlpha = 0.4;
  1407.                     canvasContext.fillStyle = "#000000";
  1408.                     canvasContext.fillRect(0, 0, 200, s);
  1409.                     canvasContext.globalAlpha = 1;
  1410.                     canvasContext.fillStyle = "#FFFFFF";
  1411.                     n = null;
  1412.                     n = "Leaderboard"; //Draws leaderboard from here on
  1413.                     canvasContext.font = "30px Ubuntu";
  1414.                     canvasContext.fillText(n, 100 - canvasContext.measureText(n).width / 2, 40);
  1415.                     canvasContext.font = "20px Ubuntu";
  1416.                     s = 0;
  1417.                     for (; s < leaderboardPlayers.length; ++s) {
  1418.                         n = leaderboardPlayers[s].name || "An unnamed cell";
  1419.                         if (-1 != playerCell.indexOf(leaderboardPlayers[s].id)) {
  1420.                             n = playerCell[0].name;
  1421.                         }
  1422.                         if (!v) {
  1423.                             if (!(0 != playerCell.length && playerCell[0].name == n)) {
  1424.                                 /** @type {string} */
  1425.                                 n = "An unnamed cell";
  1426.                             }
  1427.                         }
  1428.                         /** @type {string} */
  1429.                         n = s + 1 + ". " + n;
  1430.                         canvasContext.fillText(n, 100 - canvasContext.measureText(n).width / 2, 70 + 24 * s);
  1431.                     }
  1432.                 } else {
  1433.                     img = null;
  1434.                 }
  1435.             }
  1436.         }
  1437.  
  1438.         function cell(id, x, y, size, color, isVirus, i) {
  1439.             items.push(this);
  1440.             nodes[id] = this;
  1441.             this.id = id;
  1442.             this.ox = this.x = x;
  1443.             this.oy = this.y = y;
  1444.             this.oSize = this.size = size;
  1445.             this.color = color;
  1446.             /** @type {string} */
  1447.             this.isVirus = isVirus;
  1448.             this.points = [];
  1449.             this.pointsAcc = [];
  1450.             this.createPoints();
  1451.             this.setName(i);
  1452.         }
  1453.         /**
  1454.          * @param {?} val
  1455.          * @return {?}
  1456.          */
  1457.         function isArray(val) {
  1458.             val = val.toString(16);
  1459.             for (; 6 > val.length; ) {
  1460.                 /** @type {string} */
  1461.                 val = "0" + val;
  1462.             }
  1463.             return "#" + val;
  1464.         }
  1465.         /**
  1466.          * @param {number} n
  1467.          * @param {number} Var
  1468.          * @param {?} stroke
  1469.          * @param {?} plot
  1470.          * @return {undefined}
  1471.          */
  1472.         function SVGPlotFunction(n, Var, stroke, plot) {
  1473.             if (n) {
  1474.                 this._size = n;
  1475.             }
  1476.             if (Var) {
  1477.                 this._color = Var;
  1478.             }
  1479.             this._stroke = !!stroke;
  1480.             if (plot) {
  1481.                 this._strokeColor = plot;
  1482.             }
  1483.         }
  1484.         //if ("agar.io" != self.location.hostname && ("localhost" != self.location.hostname && "10.10.2.13" != self.location.hostname)) { //Antihack, probably going to have to remove this at some stage
  1485.         /** @type {string} */
  1486.         // self.location = "http://agar.io/";
  1487.         // } else {
  1488.         //Global variables I think
  1489.         var originalName; //For storing the original name for use when the bot restarts
  1490.         var splitted = false;
  1491.         var splitting = false;
  1492.  
  1493.         var tempPoint = [0, 0, 1];
  1494.        
  1495.         var splitted = false;
  1496.         var splitting = false;
  1497.        
  1498.         var virusBait = false;
  1499.        
  1500.         var toggle = false;
  1501.         var toggleDraw = false;
  1502.        
  1503.         var zoom = 0;
  1504.        
  1505.         var dPoints = [];
  1506.         var lines = [];
  1507.         var tempCanvas;
  1508.         var canvasContext;
  1509.         var canvas;
  1510.         var width;
  1511.         var height;
  1512.         var context = null;
  1513.         var ws = null;
  1514.         var cellX = 0;
  1515.         var cellY = 0;
  1516.         var bucket = [];
  1517.         var playerCell = [];
  1518.         var nodes = {};
  1519.         var items = [];
  1520.         var destroyedCells = [];
  1521.         var leaderboardPlayers = [];
  1522.         var currentMouseX = 0;
  1523.         var currentMouseY = 0;
  1524.         var moveX = -1;
  1525.         var moveY = -1;
  1526.         var Ba = 0;
  1527.         var e = 0;
  1528.         var result = null;
  1529.         var left = 0;
  1530.         var bottom = 0;
  1531.         var right = 1E4;
  1532.         var top = 1E4;
  1533.         var screenRatio = 1;
  1534.         var dest = null;
  1535.         var $timeout = true;
  1536.         var v = true;
  1537.         var doneResults = false;
  1538.         var aa = false;
  1539.         var closingAnimationTime = 0;
  1540.         var color = false;
  1541.         var text = false;
  1542.         var options = "ontouchstart" in self && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
  1543.         var skin_image = new Image;
  1544.         skin_image.src = "img/split.png";
  1545.         var old = null;
  1546.         self.setNick = function (subKey) {
  1547.             originalName = subKey;
  1548.             $("#adsBottom").hide();
  1549.             result = subKey;
  1550.             console.log(subKey);
  1551.             close();
  1552.             $("#overlays").hide();
  1553.             closingAnimationTime = 0;
  1554.            
  1555.             setDarkTheme(true);
  1556.             setShowMass(true);
  1557.         };
  1558.         /** @type {function (?): undefined} */
  1559.         self.setRegion = done;
  1560.         /**
  1561.          * @param {boolean} _$timeout_
  1562.          * @return {undefined}
  1563.          */
  1564.         self.setSkins = function (_$timeout_) {
  1565.             /** @type {boolean} */
  1566.             $timeout = _$timeout_;
  1567.         };
  1568.         /**
  1569.          * @param {boolean} o2
  1570.          * @return {undefined}
  1571.          */
  1572.         self.setNames = function (o2) {
  1573.             /** @type {boolean} */
  1574.             v = o2;
  1575.         };
  1576.         /**
  1577.          * @param {boolean} newColor
  1578.          * @return {undefined}
  1579.          */
  1580.         self.setDarkTheme = function (newColor) {
  1581.             /** @type {boolean} */
  1582.             color = newColor;
  1583.         };
  1584.         /**
  1585.          * @param {boolean} data
  1586.          * @return {undefined}
  1587.          */
  1588.         self.setColors = function (data) {
  1589.             /** @type {boolean} */
  1590.             doneResults = data;
  1591.         };
  1592.         /**
  1593.          * @param {boolean} textAlt
  1594.          * @return {undefined}
  1595.          */
  1596.         self.setShowMass = function (textAlt) {
  1597.             /** @type {boolean} */
  1598.             text = textAlt;
  1599.         };
  1600.         /** @type {function (string): undefined} */
  1601.         self.connect = open;
  1602.         var val = -1;
  1603.         var min = -1;
  1604.         var img = null;
  1605.         var n_players = 1;
  1606.         var button = null;
  1607.         var sources = {};
  1608.         /** @type {Array.<string>} */
  1609.         var excludes = "a;canada;australia;spain;brazil;germany;ukraine;france;sweden;hitler;north korea;south korea;japan;united kingdom;earth;greece;latvia;lithuania;estonia;finland;norway;cia;maldivas;austria;nigeria;reddit;yaranaika;confederate;9gag;indiana;4chan;italy;ussr;pewdiepie;bulgaria;tumblr;2ch.hk;hong kong;portugal;jamaica;german empire;mexico;sanik;switzerland;croatia;chile;indonesia;bangladesh;thailand;iran;iraq;peru;moon;botswana;bosnia;netherlands;european union;taiwan;pakistan;hungary;satanist;qing dynasty;nazi;matriarchy;patriarchy;feminism;ireland;texas;facepunch;prodota;cambodia;steam;piccolo;ea;india;kc;denmark;quebec;ayy lmao;sealand;bait;tsarist russia;origin;vinesauce;stalin;belgium;luxembourg;stussy;prussia;8ch;argentina;scotland;sir;romania;belarus;wojak;isis;doge;notreallyabot".split(";");
  1610.         var names = ["m'blob"];
  1611.         cell.prototype = {
  1612.             id : 0,
  1613.             points : null,
  1614.             pointsAcc : null,
  1615.             name : null,
  1616.             nameCache : null,
  1617.             sizeCache : null,
  1618.             x : 0,
  1619.             y : 0,
  1620.             size : 0,
  1621.             ox : 0,
  1622.             oy : 0,
  1623.             oSize : 0,
  1624.             nx : 0,
  1625.             ny : 0,
  1626.             nSize : 0,
  1627.             updateTime : 0,
  1628.             updateCode : 0,
  1629.             drawTime : 0,
  1630.             destroyed : false,
  1631.             isVirus : false,
  1632.             splitThreat : false,
  1633.             /**
  1634.              * @return {undefined}
  1635.              */
  1636.             destroy : function () {
  1637.                 var i;
  1638.                 i = 0;
  1639.                 for (; i < items.length; i++) {
  1640.                     if (items[i] == this) {
  1641.                         items.splice(i, 1);
  1642.                         break;
  1643.                     }
  1644.                 }
  1645.                 delete nodes[this.id];
  1646.                 i = playerCell.indexOf(this);
  1647.                 if (-1 != i) {
  1648.                     /** @type {boolean} */
  1649.                     aa = true;
  1650.                     playerCell.splice(i, 1);
  1651.                 }
  1652.                 i = bucket.indexOf(this.id);
  1653.                 if (-1 != i) {
  1654.                     bucket.splice(i, 1);
  1655.                 }
  1656.                 this.destroyed = true;
  1657.                 destroyedCells.push(this);
  1658.             },
  1659.             getNameSize : function () {
  1660.                 return Math.max(~~(0.3 * this.size), 24);
  1661.             },
  1662.             setName : function (name) {
  1663.                 if (this.name = name) {
  1664.                     if (null == this.nameCache) {
  1665.                         this.nameCache = new SVGPlotFunction(this.getNameSize(), "#FFFFFF", true, "#000000");
  1666.                     } else {
  1667.                         this.nameCache.setSize(this.getNameSize());
  1668.                     }
  1669.                     this.nameCache.setValue(this.name);
  1670.                 }
  1671.             },
  1672.             createPoints : function () {
  1673.                 var max = this.getNumPoints();
  1674.                 for (; this.points.length > max; ) {
  1675.                     var i = ~~(Math.random() * this.points.length);
  1676.                     this.points.splice(i, 1);
  1677.                     this.pointsAcc.splice(i, 1);
  1678.                 }
  1679.                 if (0 == this.points.length) {
  1680.                     if (0 < max) {
  1681.                         this.points.push({
  1682.                             c : this,
  1683.                             v : this.size,
  1684.                             x : this.x,
  1685.                             y : this.y
  1686.                         });
  1687.                         this.pointsAcc.push(Math.random() - 0.5);
  1688.                     }
  1689.                 }
  1690.                 for (; this.points.length < max; ) {
  1691.                     i = ~~(Math.random() * this.points.length);
  1692.                     var pt = this.points[i];
  1693.                     this.points.splice(i, 0, {
  1694.                         c : this,
  1695.                         v : pt.v,
  1696.                         x : pt.x,
  1697.                         y : pt.y
  1698.                     });
  1699.                     this.pointsAcc.splice(i, 0, this.pointsAcc[i]);
  1700.                 }
  1701.             },
  1702.             /**
  1703.              * @return {?}
  1704.              */
  1705.             getNumPoints : function () {
  1706.                 return ~~Math.max(this.size * screenRatio * (this.isVirus ? Math.min(2 * n_players, 1) : n_players), this.isVirus ? 10 : 5);
  1707.             },
  1708.             /**
  1709.              * @return {undefined}
  1710.              */
  1711.             movePoints : function () {
  1712.                 this.createPoints();
  1713.                 var points = this.points;
  1714.                 var chars = this.pointsAcc;
  1715.                 var value = chars.concat();
  1716.                 var rows = points.concat();
  1717.                 var l = rows.length;
  1718.                 var i = 0;
  1719.                 for (; i < l; ++i) {
  1720.                     var y = value[(i - 1 + l) % l];
  1721.                     var v = value[(i + 1) % l];
  1722.                     chars[i] += Math.random() - 0.5;
  1723.                     chars[i] *= 0.7;
  1724.                     if (10 < chars[i]) {
  1725.                         chars[i] = 10;
  1726.                     }
  1727.                     if (-10 > chars[i]) {
  1728.                         chars[i] = -10;
  1729.                     }
  1730.                     chars[i] = (y + v + 8 * chars[i]) / 10;
  1731.                 }
  1732.                 var flipped = this;
  1733.                 i = 0;
  1734.                 for (; i < l; ++i) {
  1735.                     value = rows[i].v;
  1736.                     y = rows[(i - 1 + l) % l].v;
  1737.                     v = rows[(i + 1) % l].v;
  1738.                     if (15 < this.size) {
  1739.                         var m = false;
  1740.                         var startX = points[i].x;
  1741.                         var startY = points[i].y;
  1742.                         context.retrieve2(startX - 5, startY - 5, 10, 10, function (vars) {
  1743.                             if (vars.c != flipped) {
  1744.                                 if (25 > (startX - vars.x) * (startX - vars.x) + (startY - vars.y) * (startY - vars.y)) {
  1745.                                     /** @type {boolean} */
  1746.                                     m = true;
  1747.                                 }
  1748.                             }
  1749.                         });
  1750.                         if (!m) {
  1751.                             if (points[i].x < left || (points[i].y < bottom || (points[i].x > right || points[i].y > top))) {
  1752.                                 /** @type {boolean} */
  1753.                                 m = true;
  1754.                             }
  1755.                         }
  1756.                         if (m) {
  1757.                             if (0 < chars[i]) {
  1758.                                 chars[i] = 0;
  1759.                             }
  1760.                             chars[i] -= 1;
  1761.                         }
  1762.                     }
  1763.                     value += chars[i];
  1764.                     if (0 > value) {
  1765.                         value = 0;
  1766.                     }
  1767.                     value = (12 * value + this.size) / 13;
  1768.                     points[i].v = (y + v + 8 * value) / 10;
  1769.                     y = 2 * Math.PI / l;
  1770.                     v = this.points[i].v;
  1771.                     if (this.isVirus) {
  1772.                         if (0 == i % 2) {
  1773.                             v += 5;
  1774.                         }
  1775.                     }
  1776.                     points[i].x = this.x + Math.cos(y * i) * v;
  1777.                     points[i].y = this.y + Math.sin(y * i) * v;
  1778.                 }
  1779.             },
  1780.             /**
  1781.              * @return {?}
  1782.              */
  1783.             updatePos : function () {
  1784.                 var A;
  1785.                 A = (e - this.updateTime) / 120;
  1786.                 A = 0 > A ? 0 : 1 < A ? 1 : A;
  1787.                 A = A * A * (3 - 2 * A);
  1788.                 var getNameSize = this.getNameSize();
  1789.                 if (this.destroyed && 1 <= A) {
  1790.                     var idx = destroyedCells.indexOf(this);
  1791.                     if (-1 != idx) {
  1792.                         destroyedCells.splice(idx, 1);
  1793.                     }
  1794.                 }
  1795.                 this.x = A * (this.nx - this.ox) + this.ox;
  1796.                 this.y = A * (this.ny - this.oy) + this.oy;
  1797.                 this.size = A * (this.nSize - this.oSize) + this.oSize;
  1798.                 if (!this.destroyed) {
  1799.                     if (!(getNameSize == this.getNameSize())) {
  1800.                         this.setName(this.name);
  1801.                     }
  1802.                 }
  1803.                 return A;
  1804.             },
  1805.             shouldRender : function () {
  1806.                 return this.x + this.size + 40 < cellX - width / 2 / screenRatio || (this.y + this.size + 40 < cellY - height / 2 / screenRatio || (this.x - this.size - 40 > cellX + width / 2 / screenRatio || this.y - this.size - 40 > cellY + height / 2 / screenRatio)) ? false : true;
  1807.             },
  1808.             draw : function () {
  1809.                 if (this.shouldRender()) {
  1810.                     canvasContext.save();
  1811.                     this.drawTime = e;
  1812.                     var key = this.updatePos();
  1813.                     if (this.destroyed) {
  1814.                         canvasContext.globalAlpha *= 1 - key;
  1815.                     }
  1816.                     this.movePoints();
  1817.                     if (doneResults) {
  1818.                         canvasContext.fillStyle = "#FFFFFF";
  1819.                         canvasContext.strokeStyle = "#AAAAAA";
  1820.                     } else {
  1821.                         canvasContext.fillStyle = this.color;
  1822.                         canvasContext.strokeStyle = this.color;
  1823.                     }
  1824.                     canvasContext.beginPath();
  1825.                     canvasContext.lineWidth = 10;
  1826.                     canvasContext.lineCap = "round";
  1827.                     canvasContext.lineJoin = this.isVirus ? "mitter" : "round";
  1828.                     key = this.getNumPoints();
  1829.                     canvasContext.moveTo(this.points[0].x, this.points[0].y);
  1830.                     var src = 1;
  1831.                     for (; src <= key; ++src) {
  1832.                         var i = src % key;
  1833.                         canvasContext.lineTo(this.points[i].x, this.points[i].y);
  1834.                     }
  1835.                     canvasContext.closePath();
  1836.                     key = this.name.toLowerCase();
  1837.                     if ($timeout) {
  1838.                         if (-1 != excludes.indexOf(key)) {
  1839.                             if (!sources.hasOwnProperty(key)) {
  1840.                                 sources[key] = new Image;
  1841.                                 if (key == "notreallyabot") {
  1842.                                     sources[key].src = "http://i.imgur.com/ZW5T4cd.png";
  1843.                                 } else {
  1844.                                     sources[key].src = "skins/" + key + ".png";
  1845.                                 }
  1846.                             }
  1847.                             src = sources[key];
  1848.                         } else {
  1849.                             src = null;
  1850.                         }
  1851.                     } else {
  1852.                         src = null;
  1853.                     }
  1854.                     key = src ? -1 != names.indexOf(key) : false;
  1855.                     canvasContext.stroke();
  1856.                     canvasContext.fill();
  1857.                     if (null != src) {
  1858.                         if (0 < src.width) {
  1859.                             if (!key) {
  1860.                                 canvasContext.save();
  1861.                                 canvasContext.clip();
  1862.                                 canvasContext.drawImage(src, this.x - this.size, this.y - this.size, 2 * this.size, 2 * this.size);
  1863.                                 canvasContext.restore();
  1864.                             }
  1865.                         }
  1866.                     }
  1867.                     if (doneResults || 15 < this.size) {
  1868.                         canvasContext.strokeStyle = "#000000";
  1869.                         canvasContext.globalAlpha *= 0.1;
  1870.                         canvasContext.stroke();
  1871.                     }
  1872.                     canvasContext.globalAlpha = 1;
  1873.                     if (null != src) {
  1874.                         if (0 < src.width) {
  1875.                             if (key) {
  1876.                                 canvasContext.drawImage(src, this.x - 2 * this.size, this.y - 2 * this.size, 4 * this.size, 4 * this.size);
  1877.                             }
  1878.                         }
  1879.                     }
  1880.                     key = true;//-1 != playerCell.indexOf(this);
  1881.                     src = ~~this.y;
  1882.                     if (v || key) {
  1883.                         if (this.name) {
  1884.                             if (this.nameCache) {
  1885.                                 i = this.nameCache.render();
  1886.                                 canvasContext.drawImage(i, ~~this.x - ~~(i.width / 2), src - ~~(i.height / 2));
  1887.                                 src += i.height / 2 + 4;
  1888.                             }
  1889.                         }
  1890.                     }
  1891.                     if (text) {
  1892.                         if (key) {
  1893.                             if (null == this.sizeCache) {
  1894.                                 this.sizeCache = new SVGPlotFunction(this.getNameSize() / 2, "#FFFFFF", true, "#000000");
  1895.                             }
  1896.                             this.sizeCache.setSize(this.getNameSize() / 2);
  1897.                             this.sizeCache.setValue(~~(this.size * this.size / 100));
  1898.                             i = this.sizeCache.render();
  1899.                             canvasContext.drawImage(i, ~~this.x - ~~(i.width / 2), src - ~~(i.height / 2));
  1900.                         }
  1901.                     }
  1902.                    
  1903.                     canvasContext.restore();
  1904.                 }
  1905.             }
  1906.         };
  1907.         SVGPlotFunction.prototype = {
  1908.             _value : "",
  1909.             _color : "#000000",
  1910.             _stroke : false,
  1911.             _strokeColor : "#000000",
  1912.             _size : 16,
  1913.             _canvas : null,
  1914.             _ctx : null,
  1915.             _dirty : false,
  1916.             /**
  1917.              * @param {number} size
  1918.              * @return {undefined}
  1919.              */
  1920.             setSize : function (size) {
  1921.                 if (this._size != size) {
  1922.                     this._size = size;
  1923.                     /** @type {boolean} */
  1924.                     this._dirty = true;
  1925.                 }
  1926.             },
  1927.             /**
  1928.              * @param {number} color
  1929.              * @return {undefined}
  1930.              */
  1931.             setColor : function (color) {
  1932.                 if (this._color != color) {
  1933.                     this._color = color;
  1934.                     /** @type {boolean} */
  1935.                     this._dirty = true;
  1936.                 }
  1937.             },
  1938.             /**
  1939.              * @param {boolean} stroke
  1940.              * @return {undefined}
  1941.              */
  1942.             setStroke : function (stroke) {
  1943.                 if (this._stroke != stroke) {
  1944.                     /** @type {boolean} */
  1945.                     this._stroke = stroke;
  1946.                     /** @type {boolean} */
  1947.                     this._dirty = true;
  1948.                 }
  1949.             },
  1950.             /**
  1951.              * @param {number} b
  1952.              * @return {undefined}
  1953.              */
  1954.             setStrokeColor : function (b) {
  1955.                 if (this._strokeColor != b) {
  1956.                     this._strokeColor = b;
  1957.                     /** @type {boolean} */
  1958.                     this._dirty = true;
  1959.                 }
  1960.             },
  1961.             /**
  1962.              * @param {number} value
  1963.              * @return {undefined}
  1964.              */
  1965.             setValue : function (value) {
  1966.                 if (value != this._value) {
  1967.                     this._value = value;
  1968.                     this._dirty = true;
  1969.                 }
  1970.             },
  1971.             /**
  1972.              * @return {?}
  1973.              */
  1974.             render : function () {
  1975.                 if (null == this._canvas) {
  1976.                     /** @type {Element} */
  1977.                     this._canvas = document.createElement("canvas");
  1978.                     this._ctx = this._canvas.getContext("2d");
  1979.                 }
  1980.                 if (this._dirty) {
  1981.                     var style = this._canvas;
  1982.                     var canvasContext = this._ctx;
  1983.                     var caracter = this._value;
  1984.                     var size = this._size;
  1985.                     /** @type {string} */
  1986.                     var text = size + "px Ubuntu";
  1987.                     /** @type {string} */
  1988.                     canvasContext.font = text;
  1989.                     var parentWidth = canvasContext.measureText(caracter).width;
  1990.                     var PX = ~~(0.2 * size);
  1991.                     style.width = parentWidth + 6;
  1992.                     style.height = size + PX;
  1993.                     /** @type {string} */
  1994.                     canvasContext.font = text;
  1995.                     canvasContext.globalAlpha = 1;
  1996.                     canvasContext.lineWidth = 3;
  1997.                     canvasContext.strokeStyle = this._strokeColor;
  1998.                     canvasContext.fillStyle = this._color;
  1999.                     if (this._stroke) {
  2000.                         canvasContext.strokeText(caracter, 3, size - PX / 2);
  2001.                     }
  2002.                     canvasContext.fillText(caracter, 3, size - PX / 2);
  2003.                 }
  2004.                 return this._canvas;
  2005.             }
  2006.         };
  2007.         /** @type {function (): undefined} */
  2008.         self.onload = init;
  2009.  
  2010.     })(window, jQuery);
  2011. });
  2012. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement