Advertisement
Mixis97

Agar.io bot javascript

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