AgarBot

Plays Agar

  1. // ==UserScript==
  2. // @name AgarBot
  3. // @namespace Apos
  4. // @description Plays Agar
  5. // @include http://agar.io/
  6. // @version 1
  7. // @grant none
  8. // @author twitch.tv/apostolique
  9. // @run-at document-start
  10. // ==/UserScript==
  11.  
  12.  
  13. var changed = 0; // script need to be edited with
  14.  
  15. window.addEventListener('beforescriptexecute', function (e) {
  16.  
  17. //for external script:
  18. src = e.target.src;
  19. if (src.search(/main_out\.js..../) != -1) {
  20. console.log('event listener fired, main_out found');
  21. changed++;
  22. e.preventDefault();
  23. e.stopPropagation();
  24. append(main_out);
  25. //init();
  26. };
  27.  
  28. //when done, remove the listener:
  29. if (changed == 1)
  30. window.removeEventListener(e.type, arguments.callee, true);
  31.  
  32. }, true);
  33.  
  34. ////// append with new block function:
  35. function append(s) {
  36. console.log('append fired');
  37. document.head.appendChild(document.createElement('script'))
  38. .innerHTML = s.toString().replace(/^function.*{|}$/g, '');
  39. }
  40.  
  41. ////////////////////////////////////////////////
  42. function main_out() {
  43. (function (g, q) {
  44. function wa() {
  45. ha();
  46. setInterval(ha, 180000);
  47. z = $ = document.getElementById('canvas');
  48. d = z.getContext('2d');
  49. z.onmousedown = function (a) {
  50. if (ia) {
  51. var b = a.clientX - (5 + l / 5 / 2),
  52. c = a.clientY - (5 + l / 5 / 2);
  53. if (Math.sqrt(b * b + c * c) <= l / 5 / 2) {
  54. E();
  55. A(17);
  56. return
  57. }
  58. }
  59. N = a.clientX;
  60. O = a.clientY;
  61. aa();
  62. E()
  63. };
  64. z.onmousemove = function (a) {
  65. N = a.clientX;
  66. O = a.clientY;
  67. aa()
  68. };
  69. z.onmouseup = function (a) {
  70. };
  71. var a = !1,
  72. b = !1,
  73. c = !1;
  74. g.onkeydown = function (e) {
  75. 32 != e.keyCode || a || (E(), A(17), a = !0);
  76. 81 != e.keyCode || b || (A(18), b = !0);
  77. 87 != e.keyCode || c || (E(), A(21), c = !0);
  78. 27 == e.keyCode && q('#overlays').fadeIn(200)
  79. if (84 == e.keyCode) {
  80. console.log("Toggle");
  81. toggle = !toggle;
  82. }
  83. if (82 == e.keyCode) {
  84. console.log("ToggleDraw");
  85. toggleDraw = !toggleDraw;
  86. }
  87. };
  88. g.onkeyup = function (e) {
  89. 32 == e.keyCode && (a = !1);
  90. 87 == e.keyCode && (c = !1);
  91. 81 == e.keyCode && b && (A(19), b = !1)
  92. };
  93. g.onblur = function () {
  94. A(19);
  95. c = b = a = !1
  96. };
  97. g.onresize = ja;
  98. ja();
  99. g.requestAnimationFrame ? g.requestAnimationFrame(ka) : setInterval(ba, 1000 / 60);
  100. setInterval(E, 40);
  101. la(q('#region').val());
  102. q('#overlays').show()
  103. }
  104. function xa() {
  105. if (0.5 > k) F = null;
  106. else {
  107. 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));
  108. F = QUAD.init({
  109. minX: a - (d + 100),
  110. minY: b - (d + 100),
  111. maxX: c + (d + 100),
  112. maxY: e + (d + 100)
  113. });
  114. 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])
  115. }
  116. }
  117. function aa() {
  118. P = (N - l / 2) / k + s;
  119. Q = (O - r / 2) / k + t
  120. }
  121. function ha() {
  122. null == R && (R = {
  123. }, q('#region').children().each(function () {
  124. var a = q(this),
  125. b = a.val();
  126. b && (R[b] = a.text())
  127. }));
  128. q.get('http://m.agar.io/info', function (a) {
  129. var b = {
  130. },
  131. c;
  132. for (c in a.regions) {
  133. var e =
  134. c.split(':') [0];
  135. b[e] = b[e] || 0;
  136. b[e] += a.regions[c].numPlayers
  137. }
  138. for (c in b) q('#region option[value="' + c + '"]').text(R[c] + ' (' + b[c] + ' players)')
  139. }, 'json')
  140. }
  141. function ma() {
  142. q('#adsBottom').hide();
  143. q('#overlays').hide()
  144. }
  145. function la(a) {
  146. a && a != G && (G = a, ca())
  147. }
  148. function na() {
  149. console.log('Find ' + G + H);
  150. q.ajax('http://m.agar.io/', {
  151. error: function () {
  152. setTimeout(na, 1000)
  153. },
  154. success: function (a) {
  155. a = a.split('\n');
  156. oa('ws://' + a[0])
  157. },
  158. dataType: 'text',
  159. method: 'POST',
  160. cache: !1,
  161. crossDomain: !0,
  162. data: G + H || '?'
  163. })
  164. }
  165. function ca() {
  166. G && (q('#connecting').show(), na())
  167. }
  168. function oa(a) {
  169. h && (h.onopen = null, h.onmessage = null, h.onclose = null, h.close(), h = null);
  170. B = [
  171. ];
  172. m = [
  173. ];
  174. v = {
  175. };
  176. p = [
  177. ];
  178. C = [
  179. ];
  180. w = [
  181. ];
  182. x = null;
  183. console.log('Connecting to ' + a);
  184. h = new WebSocket(a);
  185. h.binaryType = 'arraybuffer';
  186. h.onopen = ya;
  187. h.onmessage = za;
  188. h.onclose = Aa;
  189. h.onerror = function () {
  190. console.log('socket error')
  191. }
  192. }
  193. function ya(a) {
  194. q('#connecting').hide();
  195. console.log('socket open');
  196. a = new ArrayBuffer(5);
  197. var b = new DataView(a);
  198. b.setUint8(0, 254);
  199. b.setUint32(1, 1, !0);
  200. h.send(a);
  201. a = new ArrayBuffer(5);
  202. b = new DataView(a);
  203. b.setUint8(0, 255);
  204. b.setUint32(1, 1, !0);
  205. h.send(a);
  206. pa()
  207. }
  208. function Aa(a) {
  209. console.log('socket close');
  210. setTimeout(ca, 500)
  211. }
  212. function za(a) {
  213. function b() {
  214. for (var a = ''; ; ) {
  215. var b = e.getUint16(c, !0);
  216. c += 2;
  217. if (0 == b) break;
  218. a += String.fromCharCode(b)
  219. }
  220. return a
  221. }
  222. var c = 1,
  223. e = new DataView(a.data);
  224. switch (e.getUint8(0)) {
  225. case 16:
  226. Ba(e);
  227. break;
  228. case 17:
  229. I = e.getFloat32(1, !0);
  230. J = e.getFloat32(5, !0);
  231. K = e.getFloat32(9, !0);
  232. break;
  233. case 20:
  234. m = [
  235. ];
  236. B = [
  237. ];
  238. break;
  239. case 32:
  240. B.push(e.getUint32(1, !0));
  241. break;
  242. case 49:
  243. if (null != x) break;
  244. a = e.getUint32(c, !0);
  245. c += 4;
  246. w = [
  247. ];
  248. for (var d = 0; d < a; ++d) {
  249. var f = e.getUint32(c, !0),
  250. c = c + 4;
  251. w.push({
  252. id: f,
  253. name: b()
  254. })
  255. }
  256. qa();
  257. break;
  258. case 50:
  259. x = [
  260. ];
  261. a = e.getUint32(c, !0);
  262. c += 4;
  263. for (d = 0; d < a; ++d) x.push(e.getFloat32(c, !0)),
  264. c += 4;
  265. qa();
  266. break;
  267. case 64:
  268. S = e.getFloat64(1, !0),
  269. T = e.getFloat64(9, !0),
  270. U = e.getFloat64(17, !0),
  271. V = e.getFloat64(25, !0),
  272. I = (U + S) / 2,
  273. J = (V + T) / 2,
  274. K = 1,
  275. 0 == m.length && (s = I, t = J, k = K)
  276. }
  277. }
  278. function Ba(a) {
  279. D = + new Date;
  280. var b = Math.random(),
  281. c = 1;
  282. da = !1;
  283. for (var e = a.getUint16(c, !0), c = c + 2, d = 0; d < e; ++d) {
  284. var f = v[a.getUint32(c, !0)],
  285. g = v[a.getUint32(c + 4, !0)],
  286. c = c + 8;
  287. f && g && (g.destroy(), g.ox =
  288. 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)
  289. }
  290. for (; ; ) {
  291. e = a.getUint32(c, !0);
  292. c += 4;
  293. if (0 == e) break;
  294. 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;
  295. h = '#' + h;
  296. l = a.getUint8(c++);
  297. k = !!(l & 1);
  298. l & 2 && (c += 4);
  299. l & 4 && (c += 8);
  300. l & 8 && (c += 16);
  301. for (l = ''; ; ) {
  302. var n = a.getUint16(c, !0),
  303. c = c + 2;
  304. if (0 == n) break;
  305. l += String.fromCharCode(n)
  306. }
  307. n = null;
  308. 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);
  309. n.nx = d;
  310. n.ny = f;
  311. n.nSize = g;
  312. n.updateCode = b;
  313. n.updateTime = D;
  314. - 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))
  315. }
  316. a.getUint16(c, !0);
  317. c += 2;
  318. f = a.getUint32(c, !0);
  319. c += 4;
  320. for (d = 0; d < f; d++) e = a.getUint32(c, !0),
  321. c += 4,
  322. v[e] && (v[e].updateCode = b);
  323. for (d = 0; d < p.length; d++) p[d].updateCode != b && p[d--].destroy();
  324. da && 0 == m.length && q('#overlays').fadeIn(3000) && setNick(originalName)
  325. }
  326. function computeDistance(x1, y1, x2, y2) {
  327. var xdis = x1 - x2; // <--- FAKE AmS OF COURSE!
  328. var ydis = y1 - y2;
  329. var distance = Math.sqrt(Math.pow(xdis, 2) + Math.pow(ydis, 2));
  330. return distance;
  331. }
  332.  
  333. function computerDistanceFromCircleEdge(x1, y1, x2, y2, s2) {
  334. var tempD = computeDistance(x2, y2, x1, y1);
  335. var offsetX = 0;
  336. var offsetY = 0;
  337. var ratioX = tempD / (x2 - x1);
  338. var ratioY = tempD / (y2 - y1);
  339.  
  340. offsetX = x2 - (s2 / ratioX);
  341. offsetY = y2 - (s2 / ratioY);
  342. return computeDistance(x1, y1, offsetX, offsetY);
  343. }
  344.  
  345. function getListmasedOnFunction(booleanFunction, listToUse) {
  346. var dotList = [];
  347. Object.keys(listToUse).forEach(function (element, index) {
  348. if (booleanFunction(element)){
  349. dotList.push(v[element]);
  350. }
  351. });
  352. return dotList;
  353. }
  354.  
  355. //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.
  356. function getAllNiceViruses() {
  357. var dotList = [];
  358. if (m.length == 1) {
  359. dotList = getListmasedOnFunction(function (element){
  360. if (v[element].isVirus && (v[element].size *1.10 <= m[0].size) && v[element].size * 1.15 >= m[0].size) {
  361. return true;
  362. }
  363. return false;
  364. }, v);
  365. }
  366.  
  367. return dotList;
  368. }
  369.  
  370. function getAllThreats() {
  371. var dotList = [];
  372. dotList = getListmasedOnFunction(function (element){
  373. var isMe = false;
  374. for (var i = 0; i < m.length; i++) {
  375. if (v[element].id == m[i].id) {
  376. isMe = true;
  377. break;
  378. }
  379. }
  380. for (var i = 0; i < m.length; i++) {
  381. if (!isMe && (!v[element].isVirus && (v[element].size >= m[i].oSize * 1.15))) {
  382. return true;
  383. } else if (v[element].isVirus && (v[element].size * 1.15 <= m[i].oSize)) {
  384. return true;
  385. }
  386. return false;
  387. }
  388. }, v);
  389. return dotList;
  390. }
  391.  
  392. function getAllFood() {
  393. var elementList = [];
  394. var dotList = [];
  395. elementList = getListmasedOnFunction(function (element){
  396. var isMe = false;
  397. for (var i = 0; i < m.length; i++) {
  398. if (v[element].id == m[i].id) {
  399. isMe = true;
  400. break;
  401. }
  402. }
  403. for (var i = 0; i < m.length; i++) {
  404. if (!isMe && !v[element].isVirus && (v[element].size * 1.25 <= m[i].size) || (v[element].size <= 11)){return true;} else{return false;}
  405. }
  406. }, v);
  407. for (var i = 0; i < elementList.length; i++) {
  408. dotList.push([elementList[i].x, elementList[i].y, elementList[i].size]);
  409. }
  410. return dotList;
  411. }
  412.  
  413. function clusterFood(foodList, blobSize) {
  414. var clusters = [];
  415. var addedCluster = false;
  416. for (var i = 0; i < foodList.length; i++) {
  417. for (var j = 0; j < clusters.length; j++) {
  418. if (computeDistance(foodList[i][0], foodList[i][1], clusters[j][0], clusters[j][1]) < blobSize * 1.5) {
  419. clusters[j][0] = (foodList[i][0] + clusters[j][0]) / 2;
  420. clusters[j][1] = (foodList[i][1] + clusters[j][1]) / 2;
  421. clusters[j][2] += foodList[i][2];
  422. addedCluster = true;
  423. break;
  424. }
  425. }
  426. if (!addedCluster) {
  427. clusters.push([foodList[i][0], foodList[i][1], foodList[i][2]]);
  428. }
  429. addedCluster = false;
  430. }
  431. return clusters;
  432. }
  433.  
  434. //Given two points on a line, finds the slope of a perpendicular line crossing it.
  435. function inverseSlope(x1, y1, x2, y2) {
  436. var m = (y1 - y2) / (x1 - x2);
  437. return (-1) / m;
  438. }
  439.  
  440. //Given a slope and an offset, returns two points on that line.
  441. function pointsOnLine(slope, useX, useY) {
  442. var b = useY - slope * useX;
  443. return [[useX - 100, slope * (useX - 100) + b], [useX + 100, slope * (useX + 100) + b]];
  444. }
  445.  
  446. //Using a line formed from point a to b, tells if point c is on S side of that line.
  447. function isSideLine(a, b, c) {
  448. if ((b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]) > 0) {
  449. return true;
  450. }
  451. return false;
  452. }
  453.  
  454. function findDestination() {
  455. dPoints = [];
  456. lines = [];
  457. var tempMoveX = P;
  458. var tempMoveY = Q;
  459. if (m[0] != null) {
  460. var allPossibleFood = null;
  461. allPossibleFood = getAllFood(); // #1
  462. /*for (var i = -1000; i < 1000; i += m[0].size) {
  463. for (var j = -1000; j < 1000; j += m[0].size) {
  464. allPossibleFood.push([m[0].x + i, m[0].y + j, -200]);
  465. }
  466. }*/
  467. var allPossibleThreats = getAllThreats();
  468. var allPossibleNiceViruses = getAllNiceViruses();
  469. var closestNiceViruse = null;
  470. if (allPossibleNiceViruses.length != 0) {
  471. closestNiceViruse = [allPossibleNiceViruses[0], computeDistance(allPossibleNiceViruses[0].x, allPossibleNiceViruses[0].y, m[0].x, m[0].y)];
  472. for (var i = 1; i < allPossibleNiceViruses.length; i++) {
  473. var testD = computeDistance(allPossibleNiceViruses[i].x, allPossibleNiceViruses[i].y, m[0].x, m[0].y)
  474. if (testD < closestNiceViruse[1]) {
  475. closestNiceViruse = [allPossibleNiceViruses[i], testD];
  476. }
  477. }
  478. console.log("NO WAY!!! LET THE TROLLING mEGIN!");
  479. }
  480. var allThreatLines = [];
  481. var allThreatLinesmool = [];
  482. var allFallbackPointsLeft = [];
  483. var allFallbackPointsRight = [];
  484. var allFallbackmool = [];
  485. var allFallbackCount = [];
  486. var closestThreatIndex = null;
  487. var closestThreatD = null;
  488. var closestThreatIndex2 = null;
  489. var closestThreatD2 = null;
  490. var isSafeSpot = true;
  491. var clusterAllFood = clusterFood(allPossibleFood, m[0].oSize);
  492. for (var i = 0; i < allPossibleThreats.length; i++) {
  493. var tempD = computerDistanceFromCircleEdge(m[0].x, m[0].y, allPossibleThreats[i].x, allPossibleThreats[i].y, allPossibleThreats[i].size);
  494. if (closestThreatIndex != null) {
  495. if (closestThreatD > tempD) {
  496. closestThreatIndex2 = closestThreatIndex;
  497. closestThreatD2 = closestThreatD;
  498. closestThreatIndex = i;
  499. closestThreatD = tempD;
  500. }
  501. } else {
  502. closestThreatIndex = i;
  503. closestThreatD = tempD;
  504. }
  505. var ratioX = tempD / (allPossibleThreats[i].x - m[0].x);
  506. var ratioY = tempD / (allPossibleThreats[i].y - m[0].y);
  507. var offsetX = 0;
  508. var offsetY = 0;
  509. var offsetEscapeX = 0;
  510. var offsetEscapeY = 0;
  511. var offsetLeftX = 0;
  512. var offsetLeftY = 0;
  513.  
  514. var offsetRightX = 0;
  515. var offsetRightY = 0;
  516. var offsetEscapeLeftX = 0;
  517. var offsetEscapeLeftY = 0;
  518.  
  519. var offsetEscapeRightX = 0;
  520. var offsetEscapeRightY = 0;
  521. var escape = 5;
  522. var escapeMid = 3;
  523. iSlope = inverseSlope(allPossibleThreats[i].x, allPossibleThreats[i].y, m[0].x, m[0].y);
  524. var sidePoints = pointsOnLine(iSlope, allPossibleThreats[i].x, allPossibleThreats[i].y);
  525. var SD = computeDistance(allPossibleThreats[i].x, allPossibleThreats[i].y, sidePoints[0][0], sidePoints[0][1]);
  526.  
  527. var ratioLeftX = SD / (allPossibleThreats[i].x - sidePoints[0][0]);
  528. var ratioLeftY = SD / (allPossibleThreats[i].y - sidePoints[0][1]);
  529. if (allPossibleThreats[i].size >= m[0].size * 4) {
  530. offsetX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioX * 1.5);
  531. offsetY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioY * 1.5);
  532. offsetLeftX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioLeftX * 3);
  533. offsetLeftY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioLeftY * 3);
  534. offsetRightX = allPossibleThreats[i].x + (allPossibleThreats[i].size / ratioLeftX * 3);
  535. offsetRightY = allPossibleThreats[i].y + (allPossibleThreats[i].size / ratioLeftY * 3);
  536. offsetEscapeX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioX * escape);
  537. offsetEscapeY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioY * escape);
  538. offsetEscapeLeftX = offsetEscapeX - (allPossibleThreats[i].size / ratioLeftX * escapeMid);
  539. offsetEscapeLeftY = offsetEscapeY - (allPossibleThreats[i].size / ratioLeftY * escapeMid);
  540.  
  541. offsetEscapeRightX = offsetEscapeX + (allPossibleThreats[i].size / ratioLeftX * escapeMid);
  542. offsetEscapeRightY = offsetEscapeY + (allPossibleThreats[i].size / ratioLeftY * escapeMid);
  543. } else if (allPossibleThreats[i].size >= m[0].size * 2.1) {
  544. offsetX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioX * 4);
  545. offsetY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioY * 4);
  546. offsetLeftX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioLeftX * 4);
  547. offsetLeftY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioLeftY * 4);
  548. offsetRightX = allPossibleThreats[i].x + (allPossibleThreats[i].size / ratioLeftX * 4);
  549. offsetRightY = allPossibleThreats[i].y + (allPossibleThreats[i].size / ratioLeftY * 4);
  550. offsetEscapeX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioX * escape);
  551. offsetEscapeY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioY * escape);
  552. offsetEscapeLeftX = offsetEscapeX - (allPossibleThreats[i].size / ratioLeftX * escapeMid);
  553. offsetEscapeLeftY = offsetEscapeY - (allPossibleThreats[i].size / ratioLeftY * escapeMid);
  554.  
  555. offsetEscapeRightX = offsetEscapeX + (allPossibleThreats[i].size / ratioLeftX * escapeMid);
  556. offsetEscapeRightY = offsetEscapeY + (allPossibleThreats[i].size / ratioLeftY * escapeMid);
  557. } else {
  558. offsetX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioX * 1);
  559. offsetY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioY * 1);
  560. offsetLeftX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioLeftX * 3);
  561. offsetLeftY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioLeftY * 3);
  562. offsetRightX = allPossibleThreats[i].x + (allPossibleThreats[i].size / ratioLeftX * 3);
  563. offsetRightY = allPossibleThreats[i].y + (allPossibleThreats[i].size / ratioLeftY * 3);
  564. offsetEscapeX = allPossibleThreats[i].x - (allPossibleThreats[i].size / ratioX * escape);
  565. offsetEscapeY = allPossibleThreats[i].y - (allPossibleThreats[i].size / ratioY * escape);
  566. offsetEscapeLeftX = offsetEscapeX - (allPossibleThreats[i].size / ratioLeftX * escapeMid);
  567. offsetEscapeLeftY = offsetEscapeY - (allPossibleThreats[i].size / ratioLeftY * escapeMid);
  568.  
  569. offsetEscapeRightX = offsetEscapeX + (allPossibleThreats[i].size / ratioLeftX * escapeMid);
  570. offsetEscapeRightY = offsetEscapeY + (allPossibleThreats[i].size / ratioLeftY * escapeMid);
  571. }
  572. if (m[0].x < allPossibleThreats[i].x && m[0].y > allPossibleThreats[i].y) {
  573. var c = offsetRightX;
  574. offsetRightX = offsetLeftX;
  575. offsetLeftX = c;
  576.  
  577. var d = offsetRightY;
  578. offsetRightY = offsetLeftY;
  579. offsetLeftY = d;
  580. var e = offsetEscapeRightX;
  581. offsetEscapeRightX = offsetEscapeLeftX;
  582. offsetEscapeLeftX = e;
  583.  
  584. var f = offsetEscapeRightY;
  585. offsetEscapeRightY = offsetEscapeLeftY;
  586. offsetEscapeLeftY = f;
  587. //console.log("Swap");
  588. } else if (m[0].x > allPossibleThreats[i].x && m[0].y > allPossibleThreats[i].y)
  589. {
  590. var c = offsetRightX;
  591. offsetRightX = offsetLeftX;
  592. offsetLeftX = c;
  593.  
  594. var d = offsetRightY;
  595. offsetRightY = offsetLeftY;
  596. offsetLeftY = d;
  597. var e = offsetEscapeRightX;
  598. offsetEscapeRightX = offsetEscapeLeftX;
  599. offsetEscapeLeftX = e;
  600.  
  601. var f = offsetEscapeRightY;
  602. offsetEscapeRightY = offsetEscapeLeftY;
  603. offsetEscapeLeftY = f;
  604. //console.log("Swap");
  605. }
  606. //offsetX = ((allPossibleThreats[i].x + m[0].x) / 2);
  607. //offsetY = ((allPossibleThreats[i].y + m[0].y) / 2);
  608.  
  609. drawPoint(offsetX, offsetY, 2);
  610. drawPoint(offsetLeftX, offsetLeftY, 3);
  611. drawPoint(offsetRightX, offsetRightY, 3);
  612. var SSlope = inverseSlope(allPossibleThreats[i].x, allPossibleThreats[i].y, sidePoints[0][0], sidePoints[0][1]);
  613. threatLineLeft = [[offsetLeftX, offsetLeftY], [offsetX, offsetY]];
  614. threatLineRight = [[offsetRightX, offsetRightY], [offsetX, offsetY]];
  615. threatLine = pointsOnLine(iSlope, offsetX, offsetY);
  616. drawLine(allPossibleThreats[i].x, allPossibleThreats[i].y, m[0].x, m[0].y, 3);
  617. //drawLine(threatLine[0][0], threatLine[0][1], threatLine[1][0], threatLine[1][1], 0);
  618. drawLine(threatLineLeft[0][0], threatLineLeft[0][1], threatLineLeft[1][0], threatLineLeft[1][1], 0);
  619. drawLine(threatLineRight[0][0], threatLineRight[0][1], threatLineRight[1][0], threatLineRight[1][1], 0);
  620. allThreatLines.push([threatLineLeft, threatLineRight]);
  621. drawPoint(offsetEscapeLeftX, offsetEscapeLeftY, 4);
  622. drawPoint(offsetEscapeRightX, offsetEscapeRightY, 4);
  623. //drawPoint(offsetEscapeX, offsetEscapeY, 4);
  624. //allFallbackPoints.push([offsetEscapeX, offsetEscapeY]);
  625. allFallbackPointsLeft.push([offsetEscapeLeftX, offsetEscapeLeftY]);
  626. allFallbackPointsRight.push([offsetEscapeRightX, offsetEscapeRightY]);
  627. //allFallbackPoints.push([offsetEscapeRightX, offsetEscapeRightY]);
  628. allFallbackmool.push(true);
  629. //allFallbackmool.push(true);
  630. allFallbackCount.push(0);
  631. //allFallbackCount.push(0);
  632. var badSide = isSideLine(threatLine[0], threatLine[1], [allPossibleThreats[i].x, allPossibleThreats[i].y]);
  633. var badSideLeft = isSideLine(threatLineLeft[0], threatLineLeft[1], [allPossibleThreats[i].x, allPossibleThreats[i].y]);
  634. var badSideRight = isSideLine(threatLineRight[0], threatLineRight[1], [allPossibleThreats[i].x, allPossibleThreats[i].y]);
  635. allThreatLinesmool.push([badSideLeft, badSideRight]);
  636. isSafeSpot = (
  637. badSideLeft != isSideLine(threatLineLeft[0], threatLineLeft[1], [m[0].x, m[0].y]) &&
  638. badSideRight != isSideLine(threatLineRight[0], threatLineRight[1], [m[0].x, m[0].y]) && isSafeSpot
  639. );
  640. var removeClusterList = [];
  641. for (var j = 0; j < clusterAllFood.length; j++) {
  642. if (
  643. badSideLeft == isSideLine(threatLineLeft[0], threatLineLeft[1], [clusterAllFood[j][0], clusterAllFood[j][1]]) &&
  644. badSideRight == isSideLine(threatLineRight[0], threatLineRight[1], [clusterAllFood[j][0], clusterAllFood[j][1]])
  645. ) {
  646. removeClusterList.push(j);
  647. }
  648. }
  649. for (var j = removeClusterList.length - 1; j >= 0; j--) {
  650. if (!toggle) {
  651. drawPoint(clusterAllFood[j][0], clusterAllFood[j][1], 0);
  652. }
  653. clusterAllFood.splice(removeClusterList[j], 1);
  654. }
  655. if (
  656. badSideLeft == isSideLine(threatLineLeft[0], threatLineLeft[1], [tempPoint[0], tempPoint[1]]) &&
  657. badSideRight == isSideLine(threatLineRight[0], threatLineRight[1], [tempPoint[0], tempPoint[1]])
  658. ) {
  659. tempPoint[2] = 0;
  660. }
  661. }
  662. for (var i = 0; i < clusterAllFood.length; i++) {
  663. //console.log("mefore: " + clusterAllFood[i][2]);
  664. clusterAllFood[i][2] = clusterAllFood[i][2] * 6 - computeDistance(clusterAllFood[i][0], clusterAllFood[i][1], m[0].ox, m[0].oy);
  665. if (!toggle) {
  666. drawPoint(clusterAllFood[i][0], clusterAllFood[i][1], 1);
  667. }
  668. //console.log("After: " + clusterAllFood[i][2]);
  669. }
  670. if (clusterAllFood.length != 0 && isSafeSpot) {
  671. biggestCluster = clusterAllFood[0];
  672. for (var i = 1; i < clusterAllFood.length; i++) {
  673. if (clusterAllFood[i][2] > biggestCluster[2]) {
  674. biggestCluster = clusterAllFood[i];
  675. }
  676. }
  677. /**
  678. * #1 Get a list of all the food.
  679. * #2 Get a list of all the threats.
  680. * #3 Remove all the food near threats.
  681. * #4 Find closest food after the filter.
  682. */
  683. if (closestNiceViruse != null && closestNiceViruse[0].size * 1.15 <= m[0].size) {
  684. for (var i = 0; i < m.length; i++) {
  685. drawLine(m[i].ox, m[i].oy, closestNiceViruse[0].x, closestNiceViruse[0].y, 5);
  686. }
  687. virusmait = true;
  688. tempMoveX = closestNiceViruse[0].x;
  689. tempMoveY = closestNiceViruse[0].y;
  690. } else {
  691. for (var i = 0; i < m.length; i++) {
  692. drawLine(m[i].ox, m[i].oy, biggestCluster[0], biggestCluster[1], 1);
  693. }
  694. virusmait = false;
  695. tempMoveX = biggestCluster[0];
  696. tempMoveY = biggestCluster[1];
  697. //console.log("Moving");
  698. }
  699. //console.log("X: " + P + " Y: " + Q);
  700. if (!toggle) {
  701. if (m.length > 1 && splitted) {
  702. splitted = false;
  703. tempMoveX = biggestCluster[0];
  704. tempMoveY = biggestCluster[1];
  705. }
  706. if (splitting) {
  707. tempMoveX = biggestCluster[0];
  708. tempMoveY = biggestCluster[1];
  709. A(17);
  710. splitting = false;
  711. splitted = true;
  712. }
  713. if (biggestCluster[2] * 2.5 < m[0].size && biggestCluster[2] > m[0].size / 5 && biggestCluster[2] > 11 && !splitted && !splitting) {
  714. drawLine(m[0].x, m[0].y, biggestCluster[0], biggestCluster[1], 4);
  715. var worthyTargetDistance = computeDistance(m[0].x, m[0].y, biggestCluster[0], biggestCluster[1]);
  716. console.log("I want to split.");
  717. if ((worthyTargetDistance < m[0].size * 3) && m.length == 1) {
  718. tempMoveX = biggestCluster[0];
  719. tempMoveY = biggestCluster[1];
  720. splitting = true;
  721. }
  722. }
  723. }
  724. } else if (!virusmait) {
  725. //console.log("I'm lost, where do I go?");
  726. /*if (closestThreatIndex2 != null) {
  727. if (allPossibleThreats[closestThreatIndex].x < allPossibleThreats[closestThreatIndex2].x && allPossibleThreats[closestThreatIndex].y < allPossibleThreats[closestThreatIndex2].y) {
  728. tempMoveX = allFallbackPointsLeft[closestThreatIndex][0];
  729. tempMoveY = allFallbackPointsLeft[closestThreatIndex][1];
  730. } else if (allPossibleThreats[closestThreatIndex].x > allPossibleThreats[closestThreatIndex2].x && allPossibleThreats[closestThreatIndex].y < allPossibleThreats[closestThreatIndex2].y) {
  731. tempMoveX = allFallbackPointsRight[closestThreatIndex][0];
  732. tempMoveY = allFallbackPointsRight[closestThreatIndex][1];
  733. } else if (allPossibleThreats[closestThreatIndex].x < allPossibleThreats[closestThreatIndex2].x && allPossibleThreats[closestThreatIndex].y > allPossibleThreats[closestThreatIndex2].y) {
  734. tempMoveX = allFallbackPointsRight[closestThreatIndex][0];
  735. tempMoveY = allFallbackPointsRight[closestThreatIndex][1];
  736. } else if (allPossibleThreats[closestThreatIndex].x > allPossibleThreats[closestThreatIndex2].x && allPossibleThreats[closestThreatIndex].y > allPossibleThreats[closestThreatIndex2].y) {
  737. tempMoveX = allFallbackPointsLeft[closestThreatIndex][0];
  738. tempMoveY = allFallbackPointsLeft[closestThreatIndex][1];
  739. } else {
  740. console.log("Hmm, WTF!!!");
  741. }
  742. } else {
  743. tempMoveX = allFallbackPointsLeft[closestThreatIndex][0];
  744. tempMoveY = allFallbackPointsLeft[closestThreatIndex][1];
  745. }*/
  746. tempMoveX = allFallbackPointsLeft[closestThreatIndex][0];
  747. tempMoveY = allFallbackPointsLeft[closestThreatIndex][1];
  748. if (tempMoveX < S || tempMoveX > U) {
  749. tempMoveX = allFallbackPointsRight[closestThreatIndex][0];
  750. tempMoveY = allFallbackPointsRight[closestThreatIndex][1];
  751. } else if (tempMoveX < T || tempMoveX > V) {
  752. tempMoveX = allFallbackPointsRight[closestThreatIndex][0];
  753. tempMoveY = allFallbackPointsRight[closestThreatIndex][1];
  754. }
  755. drawLine(m[0].x, m[0].y, tempMoveX, tempMoveY, 6);
  756. //#1 Find closest enemy.
  757. //#2 go to its teal line.
  758. /*for (var i = 0; i < allFallbackPoints.length; i++) {
  759. for (var j = 0; j < allThreatLines.length; j++) {
  760. var badSideLeft = allThreatLinesmool[0];
  761. var badSideRight = allThreatLinesmool[1];
  762. if (allFallbackmool[i] &&
  763. badSideLeft != isSideLine(allThreatLines[j][0][0], allThreatLines[j][0][1], allFallbackPoints[i]) &&
  764. badSideRight != isSideLine(allThreatLines[j][1][0], allThreatLines[j][1][1], allFallbackPoints[i])
  765. ) {
  766. allFallbackmool[i] = true;
  767. //console.log("Step 1");
  768. } else {
  769. //console.log("Failed Step 1");
  770. allFallbackmool[i] = false;
  771. allFallbackCount[i] += 1;
  772. }
  773. }
  774. }
  775. var closestFallback = null;
  776. var fallbackDistance = null;
  777. for (var i = 1; i < allFallbackPoints.length; i++) {
  778. if (allFallbackmool[i]) {
  779. var tempDistance = computeDistance(m[0].x, m[0].y, allFallbackPoints[i][0], allFallbackPoints[i][1]);
  780. if (closestFallback != null) {
  781. if (tempDistance < fallbackDistance) {
  782. closestFallback = allFallbackPoints[i];
  783. fallbackDistance = tempDistance;
  784. }
  785. } else {
  786. //console.log("FOUND CHILL SPOT!");
  787. closestFallback = allFallbackPoints[i];
  788. fallbackDistance = tempDistance;
  789. }
  790. }
  791. }
  792. if (closestFallback != null) {
  793. console.log("ESCAPING");
  794. tempMoveX = closestFallback[0];
  795. tempMoveY = closestFallback[1];
  796. drawLine(m[0].x, m[0].y, tempMoveX, tempMoveY, 6);
  797. } else {
  798. console.log("NOPE! NEVER RUNNING AWAY!");
  799. }*/
  800. //#1 Loop through fallbackpoints
  801. //#2 Loop through threatlines
  802. //#3 Verify if a point is fine. If not, add counter to point's overlaps
  803. //#4 Go to closest safe point, otherwise find point with lowest counter.
  804. }
  805. drawPoint(tempPoint[0], tempPoint[1], tempPoint[2]);
  806. tempPoint[2] = 1;
  807. }
  808. if (!toggle) {
  809. P = tempMoveX;
  810. Q = tempMoveY;
  811. }
  812. }
  813.  
  814. function drawPoint(x_1, y_1, drawColor) {
  815. if (!toggleDraw) {
  816. var x1 = ((x_1 - I) * k) + l/2;
  817. var y1 = ((y_1 - J) * k) + r/2;
  818. dPoints.push([x1, y1, drawColor]);
  819. }
  820. }
  821.  
  822. function drawLine(x_1, y_1, x_2, y_2, drawColor) {
  823. if (!toggleDraw) {
  824. var x1 = ((x_1 - I) * k) + l/2;
  825. var y1 = ((y_1 - J) * k) + r/2;
  826. var x2 = ((x_2 - I) * k) + l/2;
  827. var y2 = ((y_2 - J) * k) + r/2;
  828. lines.push([x1, y1, x2, y2, drawColor]);
  829. }
  830. }
  831. function E() {
  832. findDestination();
  833. if (null != h && h.readyState == h.OPEN) {
  834. var a = N - l / 2,
  835. b = O - r / 2;
  836. 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))
  837. }
  838. }
  839. function pa() {
  840. if (null != h && h.readyState == h.OPEN && null != L) {
  841. var a = new ArrayBuffer(1 + 2 * L.length),
  842. b = new DataView(a);
  843. b.setUint8(0, 0);
  844. for (var c = 0; c < L.length; ++c) b.setUint16(1 + 2 * c, L.charCodeAt(c), !0);
  845. h.send(a)
  846. }
  847. }
  848. function A(a) {
  849. if (null != h && h.readyState == h.OPEN) {
  850. var b = new ArrayBuffer(1);
  851. (new DataView(b)).setUint8(0, a);
  852. h.send(b)
  853. }
  854. }
  855. function ka() {
  856. ba();
  857. g.requestAnimationFrame(ka)
  858. }
  859. function ja() {
  860. l = g.innerWidth;
  861. r = g.innerHeight;
  862. $.width = z.width = l;
  863. $.height = z.height = r;
  864. ba()
  865. }
  866. function Ca() {
  867. if (0 != m.length) {
  868. for (var a = 0, b = 0; b < m.length; b++) a += m[b].size;
  869. a = Math.pow(Math.min(64 / a, 1), 0.4) * Math.max(r / 1080, l / 1920);
  870. k = (9 * k + a) / 10
  871. }
  872. }
  873. function ba() {
  874. var a = + new Date;
  875. ++Da;
  876. D = + new Date;
  877. if (0 < m.length) {
  878. Ca();
  879. for (var b = 0, c = 0, e = 0; e < m.length; e++) m[e].updatePos(),
  880. b += m[e].x / m.length,
  881. c += m[e].y / m.length;
  882. I = b;
  883. J = c;
  884. K = k;
  885. s = (s + b) / 2;
  886. t = (t + c) / 2
  887. } else s = (29 * s + I) / 30,
  888. t = (29 * t + J) / 30,
  889. k = (9 * k + K) / 10;
  890. xa();
  891. aa();
  892. d.clearRect(0, 0, l, r);
  893. d.fillStyle = ea ? '#111111' : '#F2FBFF';
  894. d.fillRect(0, 0, l, r);
  895. d.save();
  896. d.strokeStyle = ea ? '#AAAAAA' : '#000000';
  897. d.globalAlpha = 0.2;
  898. d.scale(k, k);
  899. b = l / k;
  900. c = r / k;
  901. for (e = - 0.5 + ( - s + b / 2) % 50; e < b; e += 50) d.beginPath(),
  902. d.moveTo(e, 0),
  903. d.lineTo(e, c),
  904. d.stroke();
  905. for (e = - 0.5 + ( - t + c / 2) % 50; e < c; e += 50) d.beginPath(),
  906. d.moveTo(0, e),
  907. d.lineTo(b, e),
  908. d.stroke();
  909. d.restore();
  910. p.sort(function (a, b) {
  911. return a.size == b.size ? a.id - b.id : a.size - b.size
  912. });
  913. d.save();
  914. d.translate(l /
  915. 2, r / 2);
  916. d.scale(k, k);
  917. d.translate( - s, - t);
  918. for (e = 0; e < C.length; e++) C[e].draw();
  919. for (e = 0; e < p.length; e++) p[e].draw();
  920. d.restore();
  921. y && 0 != w.length && d.drawImage(y, l - y.width - 10, 10);
  922. M = Math.max(M, Ea());
  923. sessionScore = Math.max(sessionScore, M);
  924. 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));
  925. Fa();
  926. a = + new Date - a;
  927. a > 1000 / 60 ? u -= 0.01 : a < 1000 / 65 && (u += 0.01);
  928. 0.4 > u && (u = 0.4);
  929. 1 < u && (u = 1)
  930. for (var i = 0; i < dPoints.length; i++) {
  931. var radius = 10;
  932.  
  933. d.beginPath();
  934. d.arc(dPoints[i][0], dPoints[i][1], radius, 0, 2 * Math.PI, false);
  935.  
  936. if (dPoints[i][2] == 0) {
  937. d.fillStyle = "black";
  938. } else if (dPoints[i][2] == 1) {
  939. d.fillStyle = "yellow";
  940. } else if (dPoints[i][2] == 2) {
  941. d.fillStyle = "blue";
  942. } else if (dPoints[i][2] == 3) {
  943. d.fillStyle = "red";
  944. } else if (dPoints[i][2] == 4) {
  945. d.fillStyle = "#008080";
  946. } else {
  947. d.fillStyle = "#000000";
  948. }
  949. d.fill();
  950. d.lineWidth = 2;
  951. d.strokeStyle = '#003300';
  952. d.stroke();
  953. }
  954. d.lineWidth = 1;
  955. for(var i = 0; i < lines.length; i++) {
  956. d.beginPath();
  957. d.lineWidth = 5;
  958. if (lines[i][4] == 0) {
  959. d.strokeStyle = "#FF0000";
  960. } else if (lines[i][4] == 1) {
  961. d.strokeStyle = "#00FF00";
  962. } else if (lines[i][4] == 2) {
  963. d.strokeStyle = "#0000FF";
  964. } else if (lines[i][4] == 3) {
  965. d.strokeStyle = "#FF8000";
  966. } else if (lines[i][4] == 4) {
  967. d.strokeStyle = "#8A2BE2";
  968. } else if (lines[i][4] == 5) {
  969. d.strokeStyle = "#FF69B4";
  970. } else if (lines[i][4] == 6) {
  971. d.strokeStyle = "#008080";
  972. } else {
  973. d.strokeStyle = "#000000";
  974. }
  975. d.moveTo(lines[i][0], lines[i][1]);
  976. d.lineTo(lines[i][2], lines[i][3]);
  977. d.stroke();
  978. }
  979. d.lineWidth = 1;
  980. }
  981. function Fa() {
  982. if (ia && fa.width) {
  983. var a = l / 5;
  984. d.drawImage(fa, 5, 5, a, a)
  985. }
  986. }
  987. function Ea() {
  988. for (var a = 0, b = 0; b < m.length; b++) a += m[b].nSize * m[b].nSize;
  989. return a
  990. }
  991. function qa() {
  992. if (0 != w.length) if (Y) {
  993. y = document.createElement('canvas');
  994. var a = y.getContext('2d'),
  995. b = 60,
  996. b = null == x ? b + 24 * w.length : b + 180,
  997. c = Math.min(200, 0.3 * l) / 200;
  998. y.width = 200 * c;
  999. y.height = b * c;
  1000. a.scale(c, c);
  1001. a.globalAlpha = 0.4;
  1002. a.fillStyle = '#000000';
  1003. a.fillRect(0, 0, 200, b);
  1004. a.globalAlpha = 1;
  1005. a.fillStyle = '#FFFFFF';
  1006. c = null;
  1007. c = 'Leaderboard';
  1008. a.font = '30px Ubuntu';
  1009. a.fillText(c, 100 - a.measureText(c).width / 2, 40);
  1010. if (null == x) {
  1011. for (a.font = '20px Ubuntu', b = 0; b < w.length; ++b) {
  1012. c = w[b].name || 'An unnamed cell',
  1013. Y || (c = 'An unnamed cell'),
  1014. - 1 != B.indexOf(w[b].id) ? (m[0].name && (c = m[0].name), a.fillStyle = '#FFAAAA') : a.fillStyle = '#FFFFFF',
  1015. c = b + 1 + '. ' + c,
  1016. a.fillText(c, 100 - a.measureText(c).width / 2, 70 + 24 * b);
  1017. }
  1018. } else for (b = c = 0; b < x.length; ++b) angEnd = c + x[b] * Math.PI * 2,
  1019. a.fillStyle = Ga[b + 1],
  1020. a.beginPath(),
  1021. a.moveTo(100, 140),
  1022. a.arc(100, 140, 80, c, angEnd, !1),
  1023. a.fill(),
  1024. c = angEnd
  1025. } else y = null
  1026. }
  1027. function ra(a, b, c, e, d, f, g) {
  1028. p.push(this);
  1029. v[a] = this;
  1030. this.id = a;
  1031. this.ox = this.x = b;
  1032. this.oy = this.y = c;
  1033. this.oSize = this.size = e;
  1034. this.color = d;
  1035. this.isVirus = f;
  1036. this.points = [
  1037. ];
  1038. this.pointsAcc = [
  1039. ];
  1040. this.createPoints();
  1041. this.setName(g)
  1042. }
  1043. function X(a, b, c, e) {
  1044. a && (this._size = a);
  1045. b && (this._color = b);
  1046. this._stroke = !!c;
  1047. e && (this._strokeColor = e)
  1048. }
  1049. if ('agar.io' != g.location.hostname && 'localhost' != g.location.hostname && '10.10.2.13' != g.location.hostname) g.location = 'http://agar.io/';
  1050. else if (g.top != g) g.top.location = 'http://agar.io/';
  1051. else {
  1052. var $,
  1053. toggle = false,
  1054. toggleDraw = false,
  1055. splitted = false,
  1056. splitting = false,
  1057. virusBait = false,
  1058. tempPoint = [0, 0, 1],
  1059. dPoints = [],
  1060. lines = [],
  1061. originalName,
  1062. sessionScore = 0,
  1063. d,
  1064. z,
  1065. l,
  1066. r,
  1067. F = null,
  1068. h = null,
  1069. s = 0,
  1070. t = 0,
  1071. B = [
  1072. ],
  1073. m = [
  1074. ],
  1075. v = {
  1076. },
  1077. p = [
  1078. ],
  1079. C = [
  1080. ],
  1081. w = [
  1082. ],
  1083. N = 0,
  1084. O = 0,
  1085. P = - 1,
  1086. Q = - 1,
  1087. Da = 0,
  1088. D = 0,
  1089. L = null,
  1090. S = 0,
  1091. T = 0,
  1092. U = 10000,
  1093. V = 10000,
  1094. k = 1,
  1095. G = null,
  1096. ua = !0,
  1097. Y = !0,
  1098. ga = !1,
  1099. da = !1,
  1100. M = 0,
  1101. ea = !1,
  1102. va = !1,
  1103. I = s = ~~((S + U) / 2),
  1104. J = t = ~~((T + V) / 2),
  1105. K = 1,
  1106. H = '',
  1107. x = null,
  1108. Ga = [
  1109. '#333333',
  1110. '#FF3333',
  1111. '#33FF33',
  1112. '#3333FF'
  1113. ],
  1114. ia = 'ontouchstart' in g && /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),
  1115. fa = new Image;
  1116. fa.src = 'img/split.png';
  1117. var R = null;
  1118. g.setNick = function (a) {
  1119. originalName = a;
  1120. ma();
  1121. L = a;
  1122. pa();
  1123. M = 0
  1124. };
  1125. g.setRegion = la;
  1126. g.setSkins = function (a) {
  1127. ua = a
  1128. };
  1129. g.setNames = function (a) {
  1130. Y = a
  1131. };
  1132. g.setDarkTheme = function (a) {
  1133. ea = a
  1134. };
  1135. g.setColors =
  1136. function (a) {
  1137. ga = a
  1138. };
  1139. g.setShowMass = function (a) {
  1140. va = a
  1141. };
  1142. g.spectate = function () {
  1143. A(1);
  1144. ma()
  1145. };
  1146. g.setGameMode = function (a) {
  1147. a != H && (H = a, ca())
  1148. };
  1149. g.connect = oa;
  1150. var sa = - 1,
  1151. ta = - 1,
  1152. y = null,
  1153. u = 1,
  1154. W = null,
  1155. Z = {
  1156. },
  1157. Ha = 'notreallyabot;poland;usa;china;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;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;nasa;byzantium;imperial japan;french kingdom;somalia;turkey;mars;pokerface'.split(';'),
  1158. Ia = [
  1159. 'm\'blob'
  1160. ];
  1161. ra.prototype = {
  1162. id: 0,
  1163. points: null,
  1164. pointsAcc: null,
  1165. name: null,
  1166. nameCache: null,
  1167. sizeCache: null,
  1168. x: 0,
  1169. y: 0,
  1170. size: 0,
  1171. ox: 0,
  1172. oy: 0,
  1173. oSize: 0,
  1174. nx: 0,
  1175. ny: 0,
  1176. nSize: 0,
  1177. updateTime: 0,
  1178. updateCode: 0,
  1179. drawTime: 0,
  1180. destroyed: !1,
  1181. isVirus: !1,
  1182. destroy: function () {
  1183. var a;
  1184. for (a = 0; a < p.length; a++) if (p[a] == this) {
  1185. p.splice(a, 1);
  1186. break
  1187. }
  1188. delete v[this.id];
  1189. a = m.indexOf(this);
  1190. - 1 != a && (da = !0, m.splice(a, 1));
  1191. a = B.indexOf(this.id);
  1192. - 1 != a && B.splice(a, 1);
  1193. this.destroyed = !0;
  1194. C.push(this)
  1195. },
  1196. getNameSize: function () {
  1197. return Math.max(~~(0.3 * this.size), 24)
  1198. },
  1199. setName: function (a) {
  1200. if (this.name = a) null == this.nameCache ? this.nameCache = new X(this.getNameSize(), '#FFFFFF', !0, '#000000') : this.nameCache.setSize(this.getNameSize()),
  1201. this.nameCache.setValue(this.name)
  1202. },
  1203. createPoints: function () {
  1204. for (var a = this.getNumPoints(); this.points.length > a; ) {
  1205. var b = ~~(Math.random() * this.points.length);
  1206. this.points.splice(b, 1);
  1207. this.pointsAcc.splice(b, 1)
  1208. }
  1209. 0 == this.points.length && 0 < a && (this.points.push({
  1210. c: this,
  1211. v: this.size,
  1212. x: this.x,
  1213. y: this.y
  1214. }), this.pointsAcc.push(Math.random() - 0.5));
  1215. for (; this.points.length < a; ) {
  1216. var b = ~~(Math.random() * this.points.length),
  1217. c = this.points[b];
  1218. this.points.splice(b, 0, {
  1219. c: this,
  1220. v: c.v,
  1221. x: c.x,
  1222. y: c.y
  1223. });
  1224. this.pointsAcc.splice(b, 0, this.pointsAcc[b])
  1225. }
  1226. },
  1227. getNumPoints: function () {
  1228. var a = 10;
  1229. 20 > this.size && (a = 5);
  1230. this.isVirus && (a = 30);
  1231. return ~~Math.max(this.size * k * (this.isVirus ? Math.min(2 * u, 1) : u), a)
  1232. },
  1233. movePoints: function () {
  1234. this.createPoints();
  1235. for (var a = this.points, b = this.pointsAcc, c = b.concat(), e = a.concat(), d = e.length, f = 0; f < d; ++f) {
  1236. var g = c[(f - 1 + d) % d],
  1237. h = c[(f + 1) % d];
  1238. b[f] += Math.random() - 0.5;
  1239. b[f] *= 0.7;
  1240. 10 < b[f] && (b[f] = 10);
  1241. - 10 > b[f] && (b[f] = - 10);
  1242. b[f] = (g + h + 8 * b[f]) / 10
  1243. }
  1244. for (var l = this, f = 0; f < d; ++f) {
  1245. c = e[f].v;
  1246. g = e[(f - 1 + d) % d].v;
  1247. h = e[(f + 1) % d].v;
  1248. if (15 < this.size && null != F) {
  1249. var k = !1,
  1250. n = a[f].x,
  1251. m = a[f].y;
  1252. F.retrieve2(n - 5, m - 5, 10, 10, function (a) {
  1253. a.c != l && 25 > (n - a.x) * (n - a.x) + (m - a.y) * (m - a.y) && (k = !0)
  1254. });
  1255. !k && (a[f].x < S || a[f].y < T || a[f].x > U || a[f].y > V) && (k = !0);
  1256. k && (0 < b[f] && (b[f] = 0), b[f] -= 1)
  1257. }
  1258. c += b[f];
  1259. 0 > c && (c = 0);
  1260. c = (12 * c + this.size) / 13;
  1261. a[f].v = (g + h + 8 * c) / 10;
  1262. g = 2 * Math.PI / d;
  1263. h = this.points[f].v;
  1264. this.isVirus && 0 == f % 2 && (h += 5);
  1265. a[f].x = this.x + Math.cos(g * f) * h;
  1266. a[f].y = this.y + Math.sin(g * f) *
  1267. h
  1268. }
  1269. },
  1270. updatePos: function () {
  1271. var a;
  1272. a = (D - this.updateTime) / 120;
  1273. a = 0 > a ? 0 : 1 < a ? 1 : a;
  1274. a = a * a * (3 - 2 * a);
  1275. this.getNameSize();
  1276. if (this.destroyed && 1 <= a) {
  1277. var b = C.indexOf(this);
  1278. - 1 != b && C.splice(b, 1)
  1279. }
  1280. this.x = a * (this.nx - this.ox) + this.ox;
  1281. this.y = a * (this.ny - this.oy) + this.oy;
  1282. this.size = a * (this.nSize - this.oSize) + this.oSize;
  1283. return a
  1284. },
  1285. shouldRender: function () {
  1286. 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
  1287. },
  1288. draw: function () {
  1289. if (this.shouldRender()) {
  1290. var a = !this.isVirus &&
  1291. 0.5 > k;
  1292. d.save();
  1293. this.drawTime = D;
  1294. var b = this.updatePos();
  1295. this.destroyed && (d.globalAlpha *= 1 - b);
  1296. d.lineWidth = 10;
  1297. d.lineCap = 'round';
  1298. d.lineJoin = this.isVirus ? 'mitter' : 'round';
  1299. ga ? (d.fillStyle = '#FFFFFF', d.strokeStyle = '#AAAAAA') : (d.fillStyle = this.color, d.strokeStyle = this.color);
  1300. if (a) d.beginPath(),
  1301. d.arc(this.x, this.y, this.size, 0, 2 * Math.PI, !1);
  1302. else {
  1303. this.movePoints();
  1304. d.beginPath();
  1305. b = this.getNumPoints();
  1306. d.moveTo(this.points[0].x, this.points[0].y);
  1307. for (var c = 1; c <= b; ++c) {
  1308. var e = c % b;
  1309. d.lineTo(this.points[e].x, this.points[e].y)
  1310. }
  1311. }
  1312. d.closePath();
  1313. b = this.name.toLowerCase();
  1314. 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;
  1315. b = c ? - 1 != Ia.indexOf(b) : !1;
  1316. a || d.stroke();
  1317. d.fill();
  1318. 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());
  1319. (ga || 15 < this.size) && !a && (d.strokeStyle = '#000000', d.globalAlpha *= 0.1, d.stroke());
  1320. d.globalAlpha = 1;
  1321. 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);
  1322. c = - 1 != m.indexOf(this);
  1323. a = ~~this.y;
  1324. if ((Y || c) && this.name && this.nameCache) {
  1325. e = this.nameCache;
  1326. e.setValue(this.name);
  1327. e.setSize(this.getNameSize());
  1328. b = Math.ceil(10 * k) / 10;
  1329. e.setScale(b);
  1330. var e = e.render(),
  1331. g = ~~(e.width / b),
  1332. f = ~~(e.height / b);
  1333. d.drawImage(e, ~~this.x - ~~(g / 2), a - ~~(f / 2), g, f);
  1334. a += e.height / 2 / b + 4
  1335. }
  1336. 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 *
  1337. 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));
  1338. d.restore()
  1339. }
  1340. }
  1341. };
  1342. X.prototype = {
  1343. _value: '',
  1344. _color: '#000000',
  1345. _stroke: !1,
  1346. _strokeColor: '#000000',
  1347. _size: 16,
  1348. _canvas: null,
  1349. _ctx: null,
  1350. _dirty: !1,
  1351. _scale: 1,
  1352. setSize: function (a) {
  1353. this._size != a && (this._size = a, this._dirty = !0)
  1354. },
  1355. setScale: function (a) {
  1356. this._scale != a && (this._scale = a, this._dirty = !0)
  1357. },
  1358. setColor: function (a) {
  1359. this._color != a && (this._color = a, this._dirty = !0)
  1360. },
  1361. setStroke: function (a) {
  1362. this._stroke != a && (this._stroke =
  1363. a, this._dirty = !0)
  1364. },
  1365. setStrokeColor: function (a) {
  1366. this._strokeColor != a && (this._strokeColor = a, this._dirty = !0)
  1367. },
  1368. setValue: function (a) {
  1369. a != this._value && (this._value = a, this._dirty = !0)
  1370. },
  1371. render: function () {
  1372. null == this._canvas && (this._canvas = document.createElement('canvas'), this._ctx = this._canvas.getContext('2d'));
  1373. if (this._dirty) {
  1374. this._dirty = !1;
  1375. var a = this._canvas,
  1376. b = this._ctx,
  1377. c = this._value,
  1378. e = this._scale,
  1379. d = this._size,
  1380. f = d + 'px Ubuntu';
  1381. b.font = f;
  1382. var g = b.measureText(c).width,
  1383. h = ~~(0.2 * d);
  1384. a.width = (g + 6) * e;
  1385. a.height = (d + h) * e;
  1386. b.font = f;
  1387. b.scale(e, e);
  1388. b.globalAlpha = 1;
  1389. b.lineWidth = 3;
  1390. b.strokeStyle = this._strokeColor;
  1391. b.fillStyle = this._color;
  1392. this._stroke && b.strokeText(c, 3, d - h / 2);
  1393. b.fillText(c, 3, d - h / 2)
  1394. }
  1395. return this._canvas
  1396. }
  1397. };
  1398. g.onload = wa
  1399. }
  1400. }) (window, jQuery);
  1401. }