Advertisement
wibNAZY

Agar.io bot

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