Greasy Fork is available in English.
Plays Agar
- // ==UserScript==// @name AgarBot// @namespace Apos// @description Plays Agar// @include http://agar.io/// @version 1// @grant none// @author twitch.tv/apostolique// @run-at document-start// ==/UserScript==var changed = 0; // script need to be edited withwindow.addEventListener('beforescriptexecute', function (e) {//for external script:src = e.target.src;if (src.search(/main_out\.js..../) != -1) {console.log('event listener fired, main_out found');changed++;e.preventDefault();e.stopPropagation();append(main_out);//init();};//when done, remove the listener:if (changed == 1)window.removeEventListener(e.type, arguments.callee, true);}, true);////// append with new block function:function append(s) {console.log('append fired');document.head.appendChild(document.createElement('script')).innerHTML = s.toString().replace(/^function.*{|}$/g, '');}////////////////////////////////////////////////function main_out() {(function (g, q) {function wa() {ha();setInterval(ha, 180000);z = $ = document.getElementById('canvas');d = z.getContext('2d');z.onmousedown = function (a) {if (ia) {var b = a.clientX - (5 + l / 5 / 2),c = a.clientY - (5 + l / 5 / 2);if (Math.sqrt(b * b + c * c) <= l / 5 / 2) {E();A(17);return}}N = a.clientX;O = a.clientY;aa();E()};z.onmousemove = function (a) {N = a.clientX;O = a.clientY;aa()};z.onmouseup = function (a) {};var a = !1,b = !1,c = !1;g.onkeydown = function (e) {32 != e.keyCode || a || (E(), A(17), a = !0);81 != e.keyCode || b || (A(18), b = !0);87 != e.keyCode || c || (E(), A(21), c = !0);27 == e.keyCode && q('#overlays').fadeIn(200)if (84 == e.keyCode) {console.log("Toggle");toggle = !toggle;}if (82 == e.keyCode) {console.log("ToggleDraw");toggleDraw = !toggleDraw;}};g.onkeyup = function (e) {32 == e.keyCode && (a = !1);87 == e.keyCode && (c = !1);81 == e.keyCode && b && (A(19), b = !1)};g.onblur = function () {A(19);c = b = a = !1};g.onresize = ja;ja();g.requestAnimationFrame ? g.requestAnimationFrame(ka) : setInterval(ba, 1000 / 60);setInterval(E, 40);la(q('#region').val());q('#overlays').show()}function xa() {if (0.5 > k) F = null;else {for (var a = Number.POSITIVE_INFINITY, b = Number.POSITIVE_INFINITY, c = Number.NEGATIVE_INFINITY, e = Number.NEGATIVE_INFINITY, d = 0, f = 0; f < p.length; f++) p[f].shouldRender() && (d = Math.max(p[f].size, d), a = Math.min(p[f].x, a), b = Math.min(p[f].y, b), c = Math.max(p[f].x, c), e = Math.max(p[f].y, e));F = QUAD.init({minX: a - (d + 100),minY: b - (d + 100),maxX: c + (d + 100),maxY: e + (d + 100)});for (f = 0; f < p.length; f++) if (a = p[f], a.shouldRender()) for (b = 0; b < a.points.length; ++b) F.insert(a.points[b])}}function aa() {P = (N - l / 2) / k + s;Q = (O - r / 2) / k + t}function ha() {null == R && (R = {}, q('#region').children().each(function () {var a = q(this),b = a.val();b && (R[b] = a.text())}));q.get('http://m.agar.io/info', function (a) {var b = {},c;for (c in a.regions) {var e =c.split(':') [0];b[e] = b[e] || 0;b[e] += a.regions[c].numPlayers}for (c in b) q('#region option[value="' + c + '"]').text(R[c] + ' (' + b[c] + ' players)')}, 'json')}function ma() {q('#adsBottom').hide();q('#overlays').hide()}function la(a) {a && a != G && (G = a, ca())}function na() {console.log('Find ' + G + H);q.ajax('http://m.agar.io/', {error: function () {setTimeout(na, 1000)},success: function (a) {a = a.split('\n');oa('ws://' + a[0])},dataType: 'text',method: 'POST',cache: !1,crossDomain: !0,data: G + H || '?'})}function ca() {G && (q('#connecting').show(), na())}function oa(a) {h && (h.onopen = null, h.onmessage = null, h.onclose = null, h.close(), h = null);B = [];m = [];v = {};p = [];C = [];w = [];x = null;console.log('Connecting to ' + a);h = new WebSocket(a);h.binaryType = 'arraybuffer';h.onopen = ya;h.onmessage = za;h.onclose = Aa;h.onerror = function () {console.log('socket error')}}function ya(a) {q('#connecting').hide();console.log('socket open');a = new ArrayBuffer(5);var b = new DataView(a);b.setUint8(0, 254);b.setUint32(1, 1, !0);h.send(a);a = new ArrayBuffer(5);b = new DataView(a);b.setUint8(0, 255);b.setUint32(1, 1, !0);h.send(a);pa()}function Aa(a) {console.log('socket close');setTimeout(ca, 500)}function za(a) {function b() {for (var a = ''; ; ) {var b = e.getUint16(c, !0);c += 2;if (0 == b) break;a += String.fromCharCode(b)}return a}var c = 1,e = new DataView(a.data);switch (e.getUint8(0)) {case 16:Ba(e);break;case 17:I = e.getFloat32(1, !0);J = e.getFloat32(5, !0);K = e.getFloat32(9, !0);break;case 20:m = [];B = [];break;case 32:B.push(e.getUint32(1, !0));break;case 49:if (null != x) break;a = e.getUint32(c, !0);c += 4;w = [];for (var d = 0; d < a; ++d) {var f = e.getUint32(c, !0),c = c + 4;w.push({id: f,name: b()})}qa();break;case 50:x = [];a = e.getUint32(c, !0);c += 4;for (d = 0; d < a; ++d) x.push(e.getFloat32(c, !0)),c += 4;qa();break;case 64:S = e.getFloat64(1, !0),T = e.getFloat64(9, !0),U = e.getFloat64(17, !0),V = e.getFloat64(25, !0),I = (U + S) / 2,J = (V + T) / 2,K = 1,0 == m.length && (s = I, t = J, k = K)}}function Ba(a) {D = + new Date;var b = Math.random(),c = 1;da = !1;for (var e = a.getUint16(c, !0), c = c + 2, d = 0; d < e; ++d) {var f = v[a.getUint32(c, !0)],g = v[a.getUint32(c + 4, !0)],c = c + 8;f && g && (g.destroy(), g.ox =g.x, g.oy = g.y, g.oSize = g.size, g.nx = f.x, g.ny = f.y, g.nSize = g.size, g.updateTime = D)}for (; ; ) {e = a.getUint32(c, !0);c += 4;if (0 == e) break;for (var d = a.getFloat32(c, !0), c = c + 4, f = a.getFloat32(c, !0), c = c + 4, g = a.getFloat32(c, !0), c = c + 4, h = a.getUint8(c++), k = a.getUint8(c++), l = a.getUint8(c++), h = (h << 16 | k << 8 | l).toString(16); 6 > h.length; ) h = '0' + h;h = '#' + h;l = a.getUint8(c++);k = !!(l & 1);l & 2 && (c += 4);l & 4 && (c += 8);l & 8 && (c += 16);for (l = ''; ; ) {var n = a.getUint16(c, !0),c = c + 2;if (0 == n) break;l += String.fromCharCode(n)}n = null;v.hasOwnProperty(e) ? (n = v[e], n.updatePos(), n.ox = n.x, n.oy = n.y, n.oSize = n.size, n.color = h) : (n = new ra(e, d, f, g, h, k, l), n.pX = d, n.pY = f);n.nx = d;n.ny = f;n.nSize = g;n.updateCode = b;n.updateTime = D;- 1 != B.indexOf(e) && - 1 == m.indexOf(n) && (document.getElementById('overlays').style.display = 'none', m.push(n), 1 == m.length && (s = n.x, t = n.y))}a.getUint16(c, !0);c += 2;f = a.getUint32(c, !0);c += 4;for (d = 0; d < f; d++) e = a.getUint32(c, !0),c += 4,v[e] && (v[e].updateCode = b);for (d = 0; d < p.length; d++) p[d].updateCode != b && p[d--].destroy();da && 0 == m.length && q('#overlays').fadeIn(3000) && setNick(originalName)}function computeDistance(x1, y1, x2, y2) {var xdis = x1 - x2; // <--- FAKE AmS OF COURSE!var ydis = y1 - y2;var distance = Math.sqrt(Math.pow(xdis, 2) + Math.pow(ydis, 2));return distance;}function computerDistanceFromCircleEdge(x1, y1, x2, y2, s2) {var tempD = computeDistance(x2, y2, x1, y1);var offsetX = 0;var offsetY = 0;var ratioX = tempD / (x2 - x1);var ratioY = tempD / (y2 - y1);offsetX = x2 - (s2 / ratioX);offsetY = y2 - (s2 / ratioY);return computeDistance(x1, y1, offsetX, offsetY);}function getListmasedOnFunction(booleanFunction, listToUse) {var dotList = [];Object.keys(listToUse).forEach(function (element, index) {if (booleanFunction(element)){dotList.push(v[element]);}});return dotList;}//TODO: Make it only go to a virus if it's big enough. If it shrinks, it shouldn't only grab a single dot and go back in.function getAllNiceViruses() {var dotList = [];if (m.length == 1) {dotList = getListmasedOnFunction(function (element){if (v[element].isVirus && (v[element].size *1.10 <= m[0].size) && v[element].size * 1.15 >= m[0].size) {return true;}return false;}, v);}return dotList;}function getAllThreats() {var dotList = [];dotList = getListmasedOnFunction(function (element){var isMe = false;for (var i = 0; i < m.length; i++) {if (v[element].id == m[i].id) {isMe = true;break;}}for (var i = 0; i < m.length; i++) {if (!isMe && (!v[element].isVirus && (v[element].size >= m[i].oSize * 1.15))) {return true;} else if (v[element].isVirus && (v[element].size * 1.15 <= m[i].oSize)) {return true;}return false;}}, v);return dotList;}function getAllFood() {var elementList = [];var dotList = [];elementList = getListmasedOnFunction(function (element){var isMe = false;for (var i = 0; i < m.length; i++) {if (v[element].id == m[i].id) {isMe = true;break;}}for (var i = 0; i < m.length; i++) {if (!isMe && !v[element].isVirus && (v[element].size * 1.25 <= m[i].size) || (v[element].size <= 11)){return true;} else{return false;}}}, v);for (var i = 0; i < elementList.length; i++) {dotList.push([elementList[i].x, elementList[i].y, elementList[i].size]);}return dotList;}function clusterFood(foodList, blobSize) {var clusters = [];var addedCluster = false;for (var i = 0; i < foodList.length; i++) {for (var j = 0; j < clusters.length; j++) {if (computeDistance(foodList[i][0], foodList[i][1], clusters[j][0], clusters[j][1]) < blobSize * 1.5) {clusters[j][0] = (foodList[i][0] + clusters[j][0]) / 2;clusters[j][1] = (foodList[i][1] + clusters[j][1]) / 2;clusters[j][2] += foodList[i][2];addedCluster = true;break;}}if (!addedCluster) {clusters.push([foodList[i][0], foodList[i][1], foodList[i][2]]);}addedCluster = false;}return clusters;}//Given two points on a line, finds the slope of a perpendicular line crossing it.function inverseSlope(x1, y1, x2, y2) {var m = (y1 - y2) / (x1 - x2);return (-1) / m;}//Given a slope and an offset, returns two points on that line.function pointsOnLine(slope, useX, useY) {var b = useY - slope * useX;return [[useX - 100, slope * (useX - 100) + b], [useX + 100, slope * (useX + 100) + b]];}//Using a line formed from point a to b, tells if point c is on S side of that line.function isSideLine(a, b, c) {if ((b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]) > 0) {return true;}return false;}function findDestination() {dPoints = [];lines = [];var tempMoveX = P;var tempMoveY = Q;if (m[0] != null) {var allPossibleFood = null;allPossibleFood = getAllFood(); // #1/*for (var i = -1000; i < 1000; i += m[0].size) {for (var j = -1000; j < 1000; j += m[0].size) {allPossibleFood.push([m[0].x + i, m[0].y + j, -200]);}}*/var allPossibleThreats = getAllThreats();var allPossibleNiceViruses = getAllNiceViruses();var closestNiceViruse = null;if (allPossibleNiceViruses.length != 0) {closestNiceViruse = [allPossibleNiceViruses[0], computeDistance(allPossibleNiceViruses[0].x, allPossibleNiceViruses[0].y, m[0].x, m[0].y)];for (var i = 1; i < allPossibleNiceViruses.length; i++) {var testD = computeDistance(allPossibleNiceViruses[i].x, allPossibleNiceViruses[i].y, m[0].x, m[0].y)if (testD < closestNiceViruse[1]) {closestNiceViruse = [allPossibleNiceViruses[i], testD];}}console.log("NO WAY!!! LET THE TROLLING mEGIN!");}var allThreatLines = [];var allThreatLinesmool = [];var allFallbackPointsLeft = [];var allFallbackPointsRight = [];var allFallbackmool = [];var allFallbackCount = [];var closestThreatIndex = null;var closestThreatD = null;var closestThreatIndex2 = null;var closestThreatD2 = null;var isSafeSpot = true;var clusterAllFood = clusterFood(allPossibleFood, m[0].oSize);for (var i = 0; i < allPossibleThreats.length; i++) {var tempD = computerDistanceFromCircleEdge(m[0].x, m[0].y, allPossibleThreats[i].x, allPossibleThreats[i].y, allPossibleThreats[i].size);if (closestThreatIndex != null) {if (closestThreatD > tempD) {closestThreatIndex2 = closestThreatIndex;closestThreatD2 = closestThreatD;closestThreatIndex = i;closestThreatD = tempD;}} else {closestThreatIndex = i;closestThreatD = tempD;}var ratioX = tempD / (allPossibleThreats[i].x - m[0].x);var ratioY = tempD / (allPossibleThreats[i].y - m[0].y);var offsetX = 0;var offsetY = 0;var offsetEscapeX = 0;var offsetEscapeY = 0;var offsetLeftX = 0;var offsetLeftY = 0;var offsetRightX = 0;var offsetRightY = 0;var offsetEscapeLeftX = 0;var offsetEscapeLeftY = 0;var offsetEscapeRightX = 0;var offsetEscapeRightY = 0;var escape = 5;var escapeMid = 3;iSlope = inverseSlope(allPossibleThreats[i].x, allPossibleThreats[i].y, m[0].x, m[0].y);var sidePoints = pointsOnLine(iSlope, allPossibleThreats[i].x, allPossibleThreats[i].y);var SD = computeDistance(allPossibleThreats[i].x, allPossibleThreats[i].y, sidePoints[0][0], sidePoints[0][1]);var ratioLeftX = SD / (allPossibleThreats[i].x - sidePoints[0][0]);var ratioLeftY = SD / (allPossibleThreats[i].y - sidePoints[0][1]);if (allPossibleThreats[i].size >= m[0].size * 4) {offsetX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioX * 1.5);offsetY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioY * 1.5);offsetLeftX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioLeftX * 3);offsetLeftY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioLeftY * 3);offsetRightX = allPossibleThreats[i].x + (allPossibleThreats[i].size / ratioLeftX * 3);offsetRightY = allPossibleThreats[i].y + (allPossibleThreats[i].size / ratioLeftY * 3);offsetEscapeX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioX * escape);offsetEscapeY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioY * escape);offsetEscapeLeftX = offsetEscapeX - (allPossibleThreats[i].size / ratioLeftX * escapeMid);offsetEscapeLeftY = offsetEscapeY - (allPossibleThreats[i].size / ratioLeftY * escapeMid);offsetEscapeRightX = offsetEscapeX + (allPossibleThreats[i].size / ratioLeftX * escapeMid);offsetEscapeRightY = offsetEscapeY + (allPossibleThreats[i].size / ratioLeftY * escapeMid);} else if (allPossibleThreats[i].size >= m[0].size * 2.1) {offsetX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioX * 4);offsetY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioY * 4);offsetLeftX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioLeftX * 4);offsetLeftY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioLeftY * 4);offsetRightX = allPossibleThreats[i].x + (allPossibleThreats[i].size / ratioLeftX * 4);offsetRightY = allPossibleThreats[i].y + (allPossibleThreats[i].size / ratioLeftY * 4);offsetEscapeX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioX * escape);offsetEscapeY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioY * escape);offsetEscapeLeftX = offsetEscapeX - (allPossibleThreats[i].size / ratioLeftX * escapeMid);offsetEscapeLeftY = offsetEscapeY - (allPossibleThreats[i].size / ratioLeftY * escapeMid);offsetEscapeRightX = offsetEscapeX + (allPossibleThreats[i].size / ratioLeftX * escapeMid);offsetEscapeRightY = offsetEscapeY + (allPossibleThreats[i].size / ratioLeftY * escapeMid);} else {offsetX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioX * 1);offsetY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioY * 1);offsetLeftX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioLeftX * 3);offsetLeftY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioLeftY * 3);offsetRightX = allPossibleThreats[i].x + (allPossibleThreats[i].size / ratioLeftX * 3);offsetRightY = allPossibleThreats[i].y + (allPossibleThreats[i].size / ratioLeftY * 3);offsetEscapeX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioX * escape);offsetEscapeY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioY * escape);offsetEscapeLeftX = offsetEscapeX - (allPossibleThreats[i].size / ratioLeftX * escapeMid);offsetEscapeLeftY = offsetEscapeY - (allPossibleThreats[i].size / ratioLeftY * escapeMid);offsetEscapeRightX = offsetEscapeX + (allPossibleThreats[i].size / ratioLeftX * escapeMid);offsetEscapeRightY = offsetEscapeY + (allPossibleThreats[i].size / ratioLeftY * escapeMid);}if (m[0].x < allPossibleThreats[i].x && m[0].y > allPossibleThreats[i].y) {var c = offsetRightX;offsetRightX = offsetLeftX;offsetLeftX = c;var d = offsetRightY;offsetRightY = offsetLeftY;offsetLeftY = d;var e = offsetEscapeRightX;offsetEscapeRightX = offsetEscapeLeftX;offsetEscapeLeftX = e;var f = offsetEscapeRightY;offsetEscapeRightY = offsetEscapeLeftY;offsetEscapeLeftY = f;//console.log("Swap");} else if (m[0].x > allPossibleThreats[i].x && m[0].y > allPossibleThreats[i].y){var c = offsetRightX;offsetRightX = offsetLeftX;offsetLeftX = c;var d = offsetRightY;offsetRightY = offsetLeftY;offsetLeftY = d;var e = offsetEscapeRightX;offsetEscapeRightX = offsetEscapeLeftX;offsetEscapeLeftX = e;var f = offsetEscapeRightY;offsetEscapeRightY = offsetEscapeLeftY;offsetEscapeLeftY = f;//console.log("Swap");}//offsetX = ((allPossibleThreats[i].x + m[0].x) / 2);//offsetY = ((allPossibleThreats[i].y + m[0].y) / 2);drawPoint(offsetX, offsetY, 2);drawPoint(offsetLeftX, offsetLeftY, 3);drawPoint(offsetRightX, offsetRightY, 3);var SSlope = inverseSlope(allPossibleThreats[i].x, allPossibleThreats[i].y, sidePoints[0][0], sidePoints[0][1]);threatLineLeft = [[offsetLeftX, offsetLeftY], [offsetX, offsetY]];threatLineRight = [[offsetRightX, offsetRightY], [offsetX, offsetY]];threatLine = pointsOnLine(iSlope, offsetX, offsetY);drawLine(allPossibleThreats[i].x, allPossibleThreats[i].y, m[0].x, m[0].y, 3);//drawLine(threatLine[0][0], threatLine[0][1], threatLine[1][0], threatLine[1][1], 0);drawLine(threatLineLeft[0][0], threatLineLeft[0][1], threatLineLeft[1][0], threatLineLeft[1][1], 0);drawLine(threatLineRight[0][0], threatLineRight[0][1], threatLineRight[1][0], threatLineRight[1][1], 0);allThreatLines.push([threatLineLeft, threatLineRight]);drawPoint(offsetEscapeLeftX, offsetEscapeLeftY, 4);drawPoint(offsetEscapeRightX, offsetEscapeRightY, 4);//drawPoint(offsetEscapeX, offsetEscapeY, 4);//allFallbackPoints.push([offsetEscapeX, offsetEscapeY]);allFallbackPointsLeft.push([offsetEscapeLeftX, offsetEscapeLeftY]);allFallbackPointsRight.push([offsetEscapeRightX, offsetEscapeRightY]);//allFallbackPoints.push([offsetEscapeRightX, offsetEscapeRightY]);allFallbackmool.push(true);//allFallbackmool.push(true);allFallbackCount.push(0);//allFallbackCount.push(0);var badSide = isSideLine(threatLine[0], threatLine[1], [allPossibleThreats[i].x, allPossibleThreats[i].y]);var badSideLeft = isSideLine(threatLineLeft[0], threatLineLeft[1], [allPossibleThreats[i].x, allPossibleThreats[i].y]);var badSideRight = isSideLine(threatLineRight[0], threatLineRight[1], [allPossibleThreats[i].x, allPossibleThreats[i].y]);allThreatLinesmool.push([badSideLeft, badSideRight]);isSafeSpot = (badSideLeft != isSideLine(threatLineLeft[0], threatLineLeft[1], [m[0].x, m[0].y]) &&badSideRight != isSideLine(threatLineRight[0], threatLineRight[1], [m[0].x, m[0].y]) && isSafeSpot);var removeClusterList = [];for (var j = 0; j < clusterAllFood.length; j++) {if (badSideLeft == isSideLine(threatLineLeft[0], threatLineLeft[1], [clusterAllFood[j][0], clusterAllFood[j][1]]) &&badSideRight == isSideLine(threatLineRight[0], threatLineRight[1], [clusterAllFood[j][0], clusterAllFood[j][1]])) {removeClusterList.push(j);}}for (var j = removeClusterList.length - 1; j >= 0; j--) {if (!toggle) {drawPoint(clusterAllFood[j][0], clusterAllFood[j][1], 0);}clusterAllFood.splice(removeClusterList[j], 1);}if (badSideLeft == isSideLine(threatLineLeft[0], threatLineLeft[1], [tempPoint[0], tempPoint[1]]) &&badSideRight == isSideLine(threatLineRight[0], threatLineRight[1], [tempPoint[0], tempPoint[1]])) {tempPoint[2] = 0;}}for (var i = 0; i < clusterAllFood.length; i++) {//console.log("mefore: " + clusterAllFood[i][2]);clusterAllFood[i][2] = clusterAllFood[i][2] * 6 - computeDistance(clusterAllFood[i][0], clusterAllFood[i][1], m[0].ox, m[0].oy);if (!toggle) {drawPoint(clusterAllFood[i][0], clusterAllFood[i][1], 1);}//console.log("After: " + clusterAllFood[i][2]);}if (clusterAllFood.length != 0 && isSafeSpot) {biggestCluster = clusterAllFood[0];for (var i = 1; i < clusterAllFood.length; i++) {if (clusterAllFood[i][2] > biggestCluster[2]) {biggestCluster = clusterAllFood[i];}}/*** #1 Get a list of all the food.* #2 Get a list of all the threats.* #3 Remove all the food near threats.* #4 Find closest food after the filter.*/if (closestNiceViruse != null && closestNiceViruse[0].size * 1.15 <= m[0].size) {for (var i = 0; i < m.length; i++) {drawLine(m[i].ox, m[i].oy, closestNiceViruse[0].x, closestNiceViruse[0].y, 5);}virusmait = true;tempMoveX = closestNiceViruse[0].x;tempMoveY = closestNiceViruse[0].y;} else {for (var i = 0; i < m.length; i++) {drawLine(m[i].ox, m[i].oy, biggestCluster[0], biggestCluster[1], 1);}virusmait = false;tempMoveX = biggestCluster[0];tempMoveY = biggestCluster[1];//console.log("Moving");}//console.log("X: " + P + " Y: " + Q);if (!toggle) {if (m.length > 1 && splitted) {splitted = false;tempMoveX = biggestCluster[0];tempMoveY = biggestCluster[1];}if (splitting) {tempMoveX = biggestCluster[0];tempMoveY = biggestCluster[1];A(17);splitting = false;splitted = true;}if (biggestCluster[2] * 2.5 < m[0].size && biggestCluster[2] > m[0].size / 5 && biggestCluster[2] > 11 && !splitted && !splitting) {drawLine(m[0].x, m[0].y, biggestCluster[0], biggestCluster[1], 4);var worthyTargetDistance = computeDistance(m[0].x, m[0].y, biggestCluster[0], biggestCluster[1]);console.log("I want to split.");if ((worthyTargetDistance < m[0].size * 3) && m.length == 1) {tempMoveX = biggestCluster[0];tempMoveY = biggestCluster[1];splitting = true;}}}} else if (!virusmait) {//console.log("I'm lost, where do I go?");/*if (closestThreatIndex2 != null) {if (allPossibleThreats[closestThreatIndex].x < allPossibleThreats[closestThreatIndex2].x && allPossibleThreats[closestThreatIndex].y < allPossibleThreats[closestThreatIndex2].y) {tempMoveX = allFallbackPointsLeft[closestThreatIndex][0];tempMoveY = allFallbackPointsLeft[closestThreatIndex][1];} else if (allPossibleThreats[closestThreatIndex].x > allPossibleThreats[closestThreatIndex2].x && allPossibleThreats[closestThreatIndex].y < allPossibleThreats[closestThreatIndex2].y) {tempMoveX = allFallbackPointsRight[closestThreatIndex][0];tempMoveY = allFallbackPointsRight[closestThreatIndex][1];} else if (allPossibleThreats[closestThreatIndex].x < allPossibleThreats[closestThreatIndex2].x && allPossibleThreats[closestThreatIndex].y > allPossibleThreats[closestThreatIndex2].y) {tempMoveX = allFallbackPointsRight[closestThreatIndex][0];tempMoveY = allFallbackPointsRight[closestThreatIndex][1];} else if (allPossibleThreats[closestThreatIndex].x > allPossibleThreats[closestThreatIndex2].x && allPossibleThreats[closestThreatIndex].y > allPossibleThreats[closestThreatIndex2].y) {tempMoveX = allFallbackPointsLeft[closestThreatIndex][0];tempMoveY = allFallbackPointsLeft[closestThreatIndex][1];} else {console.log("Hmm, WTF!!!");}} else {tempMoveX = allFallbackPointsLeft[closestThreatIndex][0];tempMoveY = allFallbackPointsLeft[closestThreatIndex][1];}*/tempMoveX = allFallbackPointsLeft[closestThreatIndex][0];tempMoveY = allFallbackPointsLeft[closestThreatIndex][1];if (tempMoveX < S || tempMoveX > U) {tempMoveX = allFallbackPointsRight[closestThreatIndex][0];tempMoveY = allFallbackPointsRight[closestThreatIndex][1];} else if (tempMoveX < T || tempMoveX > V) {tempMoveX = allFallbackPointsRight[closestThreatIndex][0];tempMoveY = allFallbackPointsRight[closestThreatIndex][1];}drawLine(m[0].x, m[0].y, tempMoveX, tempMoveY, 6);//#1 Find closest enemy.//#2 go to its teal line./*for (var i = 0; i < allFallbackPoints.length; i++) {for (var j = 0; j < allThreatLines.length; j++) {var badSideLeft = allThreatLinesmool[0];var badSideRight = allThreatLinesmool[1];if (allFallbackmool[i] &&badSideLeft != isSideLine(allThreatLines[j][0][0], allThreatLines[j][0][1], allFallbackPoints[i]) &&badSideRight != isSideLine(allThreatLines[j][1][0], allThreatLines[j][1][1], allFallbackPoints[i])) {allFallbackmool[i] = true;//console.log("Step 1");} else {//console.log("Failed Step 1");allFallbackmool[i] = false;allFallbackCount[i] += 1;}}}var closestFallback = null;var fallbackDistance = null;for (var i = 1; i < allFallbackPoints.length; i++) {if (allFallbackmool[i]) {var tempDistance = computeDistance(m[0].x, m[0].y, allFallbackPoints[i][0], allFallbackPoints[i][1]);if (closestFallback != null) {if (tempDistance < fallbackDistance) {closestFallback = allFallbackPoints[i];fallbackDistance = tempDistance;}} else {//console.log("FOUND CHILL SPOT!");closestFallback = allFallbackPoints[i];fallbackDistance = tempDistance;}}}if (closestFallback != null) {console.log("ESCAPING");tempMoveX = closestFallback[0];tempMoveY = closestFallback[1];drawLine(m[0].x, m[0].y, tempMoveX, tempMoveY, 6);} else {console.log("NOPE! NEVER RUNNING AWAY!");}*///#1 Loop through fallbackpoints//#2 Loop through threatlines//#3 Verify if a point is fine. If not, add counter to point's overlaps//#4 Go to closest safe point, otherwise find point with lowest counter.}drawPoint(tempPoint[0], tempPoint[1], tempPoint[2]);tempPoint[2] = 1;}if (!toggle) {P = tempMoveX;Q = tempMoveY;}}function drawPoint(x_1, y_1, drawColor) {if (!toggleDraw) {var x1 = ((x_1 - I) * k) + l/2;var y1 = ((y_1 - J) * k) + r/2;dPoints.push([x1, y1, drawColor]);}}function drawLine(x_1, y_1, x_2, y_2, drawColor) {if (!toggleDraw) {var x1 = ((x_1 - I) * k) + l/2;var y1 = ((y_1 - J) * k) + r/2;var x2 = ((x_2 - I) * k) + l/2;var y2 = ((y_2 - J) * k) + r/2;lines.push([x1, y1, x2, y2, drawColor]);}}function E() {findDestination();if (null != h && h.readyState == h.OPEN) {var a = N - l / 2,b = O - r / 2;64 > a * a + b * b || sa == P && ta == Q || (sa = P, ta = Q, a = new ArrayBuffer(21), b = new DataView(a), b.setUint8(0, 16), b.setFloat64(1, P, !0), b.setFloat64(9, Q, !0), b.setUint32(17, 0, !0), h.send(a))}}function pa() {if (null != h && h.readyState == h.OPEN && null != L) {var a = new ArrayBuffer(1 + 2 * L.length),b = new DataView(a);b.setUint8(0, 0);for (var c = 0; c < L.length; ++c) b.setUint16(1 + 2 * c, L.charCodeAt(c), !0);h.send(a)}}function A(a) {if (null != h && h.readyState == h.OPEN) {var b = new ArrayBuffer(1);(new DataView(b)).setUint8(0, a);h.send(b)}}function ka() {ba();g.requestAnimationFrame(ka)}function ja() {l = g.innerWidth;r = g.innerHeight;$.width = z.width = l;$.height = z.height = r;ba()}function Ca() {if (0 != m.length) {for (var a = 0, b = 0; b < m.length; b++) a += m[b].size;a = Math.pow(Math.min(64 / a, 1), 0.4) * Math.max(r / 1080, l / 1920);k = (9 * k + a) / 10}}function ba() {var a = + new Date;++Da;D = + new Date;if (0 < m.length) {Ca();for (var b = 0, c = 0, e = 0; e < m.length; e++) m[e].updatePos(),b += m[e].x / m.length,c += m[e].y / m.length;I = b;J = c;K = k;s = (s + b) / 2;t = (t + c) / 2} else s = (29 * s + I) / 30,t = (29 * t + J) / 30,k = (9 * k + K) / 10;xa();aa();d.clearRect(0, 0, l, r);d.fillStyle = ea ? '#111111' : '#F2FBFF';d.fillRect(0, 0, l, r);d.save();d.strokeStyle = ea ? '#AAAAAA' : '#000000';d.globalAlpha = 0.2;d.scale(k, k);b = l / k;c = r / k;for (e = - 0.5 + ( - s + b / 2) % 50; e < b; e += 50) d.beginPath(),d.moveTo(e, 0),d.lineTo(e, c),d.stroke();for (e = - 0.5 + ( - t + c / 2) % 50; e < c; e += 50) d.beginPath(),d.moveTo(0, e),d.lineTo(b, e),d.stroke();d.restore();p.sort(function (a, b) {return a.size == b.size ? a.id - b.id : a.size - b.size});d.save();d.translate(l /2, r / 2);d.scale(k, k);d.translate( - s, - t);for (e = 0; e < C.length; e++) C[e].draw();for (e = 0; e < p.length; e++) p[e].draw();d.restore();y && 0 != w.length && d.drawImage(y, l - y.width - 10, 10);M = Math.max(M, Ea());sessionScore = Math.max(sessionScore, M);0 != M && (null == W && (W = new X(24, '#FFFFFF')), W.setValue('Score: ' + ~~(M / 100) + ' || Best Score: ' + ~~(sessionScore / 100)), c = W.render(), b = c.width, d.globalAlpha = 0.2, d.fillStyle = '#000000', d.fillRect(10, r - 10 - 24 - 10, b + 10, 34), d.globalAlpha = 1, d.drawImage(c, 15, r - 10 - 24 - 5));Fa();a = + new Date - a;a > 1000 / 60 ? u -= 0.01 : a < 1000 / 65 && (u += 0.01);0.4 > u && (u = 0.4);1 < u && (u = 1)for (var i = 0; i < dPoints.length; i++) {var radius = 10;d.beginPath();d.arc(dPoints[i][0], dPoints[i][1], radius, 0, 2 * Math.PI, false);if (dPoints[i][2] == 0) {d.fillStyle = "black";} else if (dPoints[i][2] == 1) {d.fillStyle = "yellow";} else if (dPoints[i][2] == 2) {d.fillStyle = "blue";} else if (dPoints[i][2] == 3) {d.fillStyle = "red";} else if (dPoints[i][2] == 4) {d.fillStyle = "#008080";} else {d.fillStyle = "#000000";}d.fill();d.lineWidth = 2;d.strokeStyle = '#003300';d.stroke();}d.lineWidth = 1;for(var i = 0; i < lines.length; i++) {d.beginPath();d.lineWidth = 5;if (lines[i][4] == 0) {d.strokeStyle = "#FF0000";} else if (lines[i][4] == 1) {d.strokeStyle = "#00FF00";} else if (lines[i][4] == 2) {d.strokeStyle = "#0000FF";} else if (lines[i][4] == 3) {d.strokeStyle = "#FF8000";} else if (lines[i][4] == 4) {d.strokeStyle = "#8A2BE2";} else if (lines[i][4] == 5) {d.strokeStyle = "#FF69B4";} else if (lines[i][4] == 6) {d.strokeStyle = "#008080";} else {d.strokeStyle = "#000000";}d.moveTo(lines[i][0], lines[i][1]);d.lineTo(lines[i][2], lines[i][3]);d.stroke();}d.lineWidth = 1;}function Fa() {if (ia && fa.width) {var a = l / 5;d.drawImage(fa, 5, 5, a, a)}}function Ea() {for (var a = 0, b = 0; b < m.length; b++) a += m[b].nSize * m[b].nSize;return a}function qa() {if (0 != w.length) if (Y) {y = document.createElement('canvas');var a = y.getContext('2d'),b = 60,b = null == x ? b + 24 * w.length : b + 180,c = Math.min(200, 0.3 * l) / 200;y.width = 200 * c;y.height = b * c;a.scale(c, c);a.globalAlpha = 0.4;a.fillStyle = '#000000';a.fillRect(0, 0, 200, b);a.globalAlpha = 1;a.fillStyle = '#FFFFFF';c = null;c = 'Leaderboard';a.font = '30px Ubuntu';a.fillText(c, 100 - a.measureText(c).width / 2, 40);if (null == x) {for (a.font = '20px Ubuntu', b = 0; b < w.length; ++b) {c = w[b].name || 'An unnamed cell',Y || (c = 'An unnamed cell'),- 1 != B.indexOf(w[b].id) ? (m[0].name && (c = m[0].name), a.fillStyle = '#FFAAAA') : a.fillStyle = '#FFFFFF',c = b + 1 + '. ' + c,a.fillText(c, 100 - a.measureText(c).width / 2, 70 + 24 * b);}} else for (b = c = 0; b < x.length; ++b) angEnd = c + x[b] * Math.PI * 2,a.fillStyle = Ga[b + 1],a.beginPath(),a.moveTo(100, 140),a.arc(100, 140, 80, c, angEnd, !1),a.fill(),c = angEnd} else y = null}function ra(a, b, c, e, d, f, g) {p.push(this);v[a] = this;this.id = a;this.ox = this.x = b;this.oy = this.y = c;this.oSize = this.size = e;this.color = d;this.isVirus = f;this.points = [];this.pointsAcc = [];this.createPoints();this.setName(g)}function X(a, b, c, e) {a && (this._size = a);b && (this._color = b);this._stroke = !!c;e && (this._strokeColor = e)}if ('agar.io' != g.location.hostname && 'localhost' != g.location.hostname && '10.10.2.13' != g.location.hostname) g.location = 'http://agar.io/';else if (g.top != g) g.top.location = 'http://agar.io/';else {var $,toggle = false,toggleDraw = false,splitted = false,splitting = false,virusBait = false,tempPoint = [0, 0, 1],dPoints = [],lines = [],originalName,sessionScore = 0,d,z,l,r,F = null,h = null,s = 0,t = 0,B = [],m = [],v = {},p = [],C = [],w = [],N = 0,O = 0,P = - 1,Q = - 1,Da = 0,D = 0,L = null,S = 0,T = 0,U = 10000,V = 10000,k = 1,G = null,ua = !0,Y = !0,ga = !1,da = !1,M = 0,ea = !1,va = !1,I = s = ~~((S + U) / 2),J = t = ~~((T + V) / 2),K = 1,H = '',x = null,Ga = ['#333333','#FF3333','#33FF33','#3333FF'],ia = 'ontouchstart' in g && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),fa = new Image;fa.src = 'img/split.png';var R = null;g.setNick = function (a) {originalName = a;ma();L = a;pa();M = 0};g.setRegion = la;g.setSkins = function (a) {ua = a};g.setNames = function (a) {Y = a};g.setDarkTheme = function (a) {ea = a};g.setColors =function (a) {ga = a};g.setShowMass = function (a) {va = a};g.spectate = function () {A(1);ma()};g.setGameMode = function (a) {a != H && (H = a, ca())};g.connect = oa;var sa = - 1,ta = - 1,y = null,u = 1,W = null,Z = {},Ha = 'notreallyabot;poland;usa;#####;russia;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;bulgaria;tumblr;2ch.hk;#### kong;portugal;jamaica;german empire;mexico;sanik;switzerland;croatia;chile;indonesia;bangladesh;thailand;iran;iraq;peru;moon;botswana;bosnia;netherlands;european union;######;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;nasa;byzantium;imperial japan;french kingdom;somalia;turkey;mars;pokerface'.split(';'),Ia = ['m\'blob'];ra.prototype = {id: 0,points: null,pointsAcc: null,name: null,nameCache: null,sizeCache: null,x: 0,y: 0,size: 0,ox: 0,oy: 0,oSize: 0,nx: 0,ny: 0,nSize: 0,updateTime: 0,updateCode: 0,drawTime: 0,destroyed: !1,isVirus: !1,destroy: function () {var a;for (a = 0; a < p.length; a++) if (p[a] == this) {p.splice(a, 1);break}delete v[this.id];a = m.indexOf(this);- 1 != a && (da = !0, m.splice(a, 1));a = B.indexOf(this.id);- 1 != a && B.splice(a, 1);this.destroyed = !0;C.push(this)},getNameSize: function () {return Math.max(~~(0.3 * this.size), 24)},setName: function (a) {if (this.name = a) null == this.nameCache ? this.nameCache = new X(this.getNameSize(), '#FFFFFF', !0, '#000000') : this.nameCache.setSize(this.getNameSize()),this.nameCache.setValue(this.name)},createPoints: function () {for (var a = this.getNumPoints(); this.points.length > a; ) {var b = ~~(Math.random() * this.points.length);this.points.splice(b, 1);this.pointsAcc.splice(b, 1)}0 == this.points.length && 0 < a && (this.points.push({c: this,v: this.size,x: this.x,y: this.y}), this.pointsAcc.push(Math.random() - 0.5));for (; this.points.length < a; ) {var b = ~~(Math.random() * this.points.length),c = this.points[b];this.points.splice(b, 0, {c: this,v: c.v,x: c.x,y: c.y});this.pointsAcc.splice(b, 0, this.pointsAcc[b])}},getNumPoints: function () {var a = 10;20 > this.size && (a = 5);this.isVirus && (a = 30);return ~~Math.max(this.size * k * (this.isVirus ? Math.min(2 * u, 1) : u), a)},movePoints: function () {this.createPoints();for (var a = this.points, b = this.pointsAcc, c = b.concat(), e = a.concat(), d = e.length, f = 0; f < d; ++f) {var g = c[(f - 1 + d) % d],h = c[(f + 1) % d];b[f] += Math.random() - 0.5;b[f] *= 0.7;10 < b[f] && (b[f] = 10);- 10 > b[f] && (b[f] = - 10);b[f] = (g + h + 8 * b[f]) / 10}for (var l = this, f = 0; f < d; ++f) {c = e[f].v;g = e[(f - 1 + d) % d].v;h = e[(f + 1) % d].v;if (15 < this.size && null != F) {var k = !1,n = a[f].x,m = a[f].y;F.retrieve2(n - 5, m - 5, 10, 10, function (a) {a.c != l && 25 > (n - a.x) * (n - a.x) + (m - a.y) * (m - a.y) && (k = !0)});!k && (a[f].x < S || a[f].y < T || a[f].x > U || a[f].y > V) && (k = !0);k && (0 < b[f] && (b[f] = 0), b[f] -= 1)}c += b[f];0 > c && (c = 0);c = (12 * c + this.size) / 13;a[f].v = (g + h + 8 * c) / 10;g = 2 * Math.PI / d;h = this.points[f].v;this.isVirus && 0 == f % 2 && (h += 5);a[f].x = this.x + Math.cos(g * f) * h;a[f].y = this.y + Math.sin(g * f) *h}},updatePos: function () {var a;a = (D - this.updateTime) / 120;a = 0 > a ? 0 : 1 < a ? 1 : a;a = a * a * (3 - 2 * a);this.getNameSize();if (this.destroyed && 1 <= a) {var b = C.indexOf(this);- 1 != b && C.splice(b, 1)}this.x = a * (this.nx - this.ox) + this.ox;this.y = a * (this.ny - this.oy) + this.oy;this.size = a * (this.nSize - this.oSize) + this.oSize;return a},shouldRender: function () {return this.x + this.size + 40 < s - l / 2 / k || this.y + this.size + 40 < t - r / 2 / k || this.x - this.size - 40 > s + l / 2 / k || this.y - this.size - 40 > t + r / 2 / k ? !1 : !0},draw: function () {if (this.shouldRender()) {var a = !this.isVirus &&0.5 > k;d.save();this.drawTime = D;var b = this.updatePos();this.destroyed && (d.globalAlpha *= 1 - b);d.lineWidth = 10;d.lineCap = 'round';d.lineJoin = this.isVirus ? 'mitter' : 'round';ga ? (d.fillStyle = '#FFFFFF', d.strokeStyle = '#AAAAAA') : (d.fillStyle = this.color, d.strokeStyle = this.color);if (a) d.beginPath(),d.arc(this.x, this.y, this.size, 0, 2 * Math.PI, !1);else {this.movePoints();d.beginPath();b = this.getNumPoints();d.moveTo(this.points[0].x, this.points[0].y);for (var c = 1; c <= b; ++c) {var e = c % b;d.lineTo(this.points[e].x, this.points[e].y)}}d.closePath();b = this.name.toLowerCase();ua && '' == H ? - 1 != Ha.indexOf(b) ? (Z.hasOwnProperty(b) || (Z[b] = new Image, b == "notreallyabot" ? Z[b].src = "http://i.imgur.com/ZW5T4cd.png" : Z[b].src = 'skins/' + b + '.png'), c = Z[b]) : c = null : c = null;b = c ? - 1 != Ia.indexOf(b) : !1;a || d.stroke();d.fill();null != c && 0 < c.width && !b && (d.save(), d.clip(), d.drawImage(c, this.x - this.size, this.y - this.size, 2 * this.size, 2 * this.size), d.restore());(ga || 15 < this.size) && !a && (d.strokeStyle = '#000000', d.globalAlpha *= 0.1, d.stroke());d.globalAlpha = 1;null != c && 0 < c.width && b && d.drawImage(c, this.x - 2 * this.size, this.y - 2 * this.size, 4 * this.size, 4 * this.size);c = - 1 != m.indexOf(this);a = ~~this.y;if ((Y || c) && this.name && this.nameCache) {e = this.nameCache;e.setValue(this.name);e.setSize(this.getNameSize());b = Math.ceil(10 * k) / 10;e.setScale(b);var e = e.render(),g = ~~(e.width / b),f = ~~(e.height / b);d.drawImage(e, ~~this.x - ~~(g / 2), a - ~~(f / 2), g, f);a += e.height / 2 / b + 4}va && c && (null == this.sizeCache && (this.sizeCache = new X(this.getNameSize() / 2, '#FFFFFF', !0, '#000000')), c = this.sizeCache, c.setSize(this.getNameSize() / 2), c.setValue(~~(this.size * this.size / 100)), b = Math.ceil(10 *k) / 10, c.setScale(b), e = c.render(), g = ~~(e.width / b), f = ~~(e.height / b), d.drawImage(e, ~~this.x - ~~(g / 2), a - ~~(f / 2), g, f));d.restore()}}};X.prototype = {_value: '',_color: '#000000',_stroke: !1,_strokeColor: '#000000',_size: 16,_canvas: null,_ctx: null,_dirty: !1,_scale: 1,setSize: function (a) {this._size != a && (this._size = a, this._dirty = !0)},setScale: function (a) {this._scale != a && (this._scale = a, this._dirty = !0)},setColor: function (a) {this._color != a && (this._color = a, this._dirty = !0)},setStroke: function (a) {this._stroke != a && (this._stroke =a, this._dirty = !0)},setStrokeColor: function (a) {this._strokeColor != a && (this._strokeColor = a, this._dirty = !0)},setValue: function (a) {a != this._value && (this._value = a, this._dirty = !0)},render: function () {null == this._canvas && (this._canvas = document.createElement('canvas'), this._ctx = this._canvas.getContext('2d'));if (this._dirty) {this._dirty = !1;var a = this._canvas,b = this._ctx,c = this._value,e = this._scale,d = this._size,f = d + 'px Ubuntu';b.font = f;var g = b.measureText(c).width,h = ~~(0.2 * d);a.width = (g + 6) * e;a.height = (d + h) * e;b.font = f;b.scale(e, e);b.globalAlpha = 1;b.lineWidth = 3;b.strokeStyle = this._strokeColor;b.fillStyle = this._color;this._stroke && b.strokeText(c, 3, d - h / 2);b.fillText(c, 3, d - h / 2)}return this._canvas}};g.onload = wa}}) (window, jQuery);}