Advertisement
Guest User

Autoscript

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