// ==UserScript==
// @name RicH HackS v3.0
// @namespace http://slither.io/
// @version 3.0
// @description SSlither.io Bot v1.2 - Slitheriogameplay.com
// @author Slitheriogameplay.com and Thanks to Ermiya Eskandary & Théophile Cailliau
// @match http://slither.io/
// @grant none
// ==/UserScript==
// Functions needed for the bot
// Custom logging function - disabled by default
window.log = function() {
if (window.logDebugging) {
console.log.apply(console, arguments);
}
};
// Appends divs to the page - used to display things on the screen
window.appendDiv = function(id, className, style) {
// Create a div
var div = document.createElement('div');
// Check for id
if (id) {
// Set the id
div.id = id;
}
// Check for class name
if (className) {
// Set the class name
div.className = className;
}
// Check for css styles
if (style) {
// Set the css styles
div.style = style;
}
// Append the div to the page
document.body.appendChild(div);
};
// Saves username when you click on "Play" button
window.play_btn.btnf.addEventListener('click', function() {
window.saveNick();
});
// Save nickname when you press "Enter"
window.nick_holder.addEventListener('keypress', function(e) {
if (e.keyCode == 13) {
window.saveNick();
}
});
// Save nickname
window.saveNick = function() {
var nick = document.getElementById('nick').value;
window.savePreference('savedNick', nick);
};
// Set fake mouse coordinates
window.setMouseCoordinates = function(x, y) {
window.xm = x;
window.ym = y;
};
// Coordinates relative to the center (snake position).
window.mouseRelativeToCenter = function(x, y) {
var mapX = x - window.getWidth() / 2;
var mapY = y - window.getHeight() / 2;
return [mapX, mapY];
};
// Mouse coordinates to screen coordinates
window.mouseToScreen = function(x, y) {
var screenX = x + (window.getWidth() / 2);
var screenY = y + (window.getHeight() / 2);
return [screenX, screenY];
};
// Screen to canvas coordinates
window.screenToCanvas = function(x, y) {
var canvasX = window.csc * (x * window.canvasRatio[0]) - parseInt(window.mc.style.left);
var canvasY = window.csc * (y * window.canvasRatio[1]) - parseInt(window.mc.style.top);
return [canvasX, canvasY];
};
// Map to mouse coordinates
window.mapToMouse = function(x, y) {
var mouseX = (x - window.getX()) * window.gsc;
var mouseY = (y - window.getY()) * window.gsc;
return [mouseX, mouseY];
};
// Canvas width
window.getWidth = function() {
return window.ww;
};
// Canvas height
window.getHeight = function() {
return window.hh;
};
// X coordinates on the screen
window.getX = function() {
return window.snake.xx;
};
// Y coordinates on the screen
window.getY = function() {
return window.snake.yy;
};
// Updates the relation between the screen and the canvas
window.onresize = function() {
window.resize();
// Canvas different size from the screen (often bigger). Gives a ratio so we can convert
window.canvasRatio = [window.mc.width / window.getWidth(), window.mc.height / window.getHeight()];
};
// Lets you zoom in and out using the mouse wheel
window.setZoom = function(e) {
// Scaling ratio
if (window.gsc) {
window.gsc *= Math.pow(0.9, e.wheelDelta / -120 || e.detail / 2 || 0);
}
};
// FPS counter
window.framesPerSecond = {
startTime: 0,
frameNumber: 0,
filterStrength: 40,
lastLoop: 0,
frameTime: 0,
getFPS: function() {
var thisLoop = performance.now();
var thisFrameTime = thisLoop - this.lastLoop;
this.frameTime += (thisFrameTime - this.frameTime) / this.filterStrength;
this.lastLoop = thisLoop;
return (1000 / this.frameTime).toFixed(0);
}
};
// Set background - default is slither.io's own background
function setBackground(url = '/s/bg45.jpg') {
window.ii.src = url;
}
// Reset zoom
window.resetZoom = function() {
window.gsc = 0.9;
}
// Get scaling ratio
window.getScale = function() {
return window.gsc;
};
// Snake length
window.getSnakeLength = function() {
return (Math.floor(150 * (window.fpsls[window.snake.sct] + window.snake.fam / window.fmlts[window.snake.sct] - 1) - 50) / 10);
};
// Save the original slither.io onmousemove function so we can re enable it back later
window.mousemovelistener = window.onmousemove;
// Starts the bot
window.launchBot = function() {
window.log('Starting Bot.');
window.isBotRunning = true;
// Removed the onmousemove listener so we can move the snake manually by setting coordinates
window.onmousemove = function() {};
};
// Stops the bot
window.stopBot = function() {
window.log('Stopping Bot.');
// Re enable the original onmousemove function
window.onmousemove = window.mousemovelistener;
window.isBotRunning = false;
// Clear the interval which starts the bot
};
// Connects the bot
window.connectBot = function() {
if (!window.autoRespawn) return;
// Stop the bot
window.stopBot();
window.log('Connecting...');
// Connect the bot
window.connect();
// Check if bot can start
window.botCanStart = setInterval(function() {
if (window.playing) {
window.launchBot();
clearInterval(window.botCanStart);
}
}, 100);
};
// Save variable to local storage
window.savePreference = function(item, value) {
window.localStorage.setItem(item, value);
};
// Load a variable from local storage
window.loadPreference = function(preference, defaultVar) {
var savedItem = window.localStorage.getItem(preference);
if (savedItem !== null) {
if (savedItem == 'true') {
window[preference] = true;
} else if (savedItem == 'false') {
window[preference] = false;
} else {
window[preference] = savedItem;
}
window.log('Setting found for ' + preference + ': ' + window[preference]);
} else {
window[preference] = defaultVar;
window.log('No setting found for ' + preference + '. Used default: ' + window[preference]);
}
return window[preference];
};
// Save the original slither.io onkeydown function so we can add stuff to it
document.oldKeyDown = document.onkeydown;
// Re write the function with our function
document.onkeydown = function(e) {
// Original slither.io onkeydown function + whatever is under it
document.oldKeyDown(e);
if (document.activeElement.parentElement !== window.nick_holder) {
// Number `1` to toggle bot
if (e.keyCode === 49) {
if (window.isBotRunning) {
window.stopBot();
window.isBotEnabled = false;
} else {
window.launchBot(5);
window.isBotEnabled = true;
}
}
// Number '3' to toggle debugging (console)
if (e.keyCode === 51) {
window.logDebugging = !window.logDebugging;
console.log('Log debugging set to: ' + window.logDebugging);
window.savePreference('logDebugging', window.logDebugging);
}
// Number '2' to toggle debugging (visual)
if (e.keyCode === 50) {
window.visualDebugging = !window.visualDebugging;
console.log('Visual debugging set to: ' + window.visualDebugging);
window.savePreference('visualDebugging', window.visualDebugging);
}
// Number '4' to toggle autorespawn
if (e.keyCode === 52) {
window.autoRespawn = !window.autoRespawn;
console.log('Automatic Respawning set to: ' + window.autoRespawn);
window.savePreference('autoRespawn', window.autoRespawn);
}
// Number '5' to change rendermode (visual)
if (e.keyCode === 53) {
window.mobileRender = !window.mobileRender;
console.log('Mobile rendering set to: ' + window.mobileRender);
window.savePreference('mobileRender', window.mobileRender);
// Set render mode
if (window.mobileRender) {
setBackground('data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs');
window.render_mode = 1;
} else {
setBackground();
window.render_mode = 2;
}
}
// Number '6' to toggle hunting Prey
if (e.keyCode === 54) {
window.huntPrey = !window.huntPrey;
console.log('Prey hunting set to: ' + window.huntPrey);
window.savePreference('huntPrey', window.huntPrey);
}
// Number '7' to toggle Collision detection / enemy avoidance
if (e.keyCode === 55) {
window.collisionDetection = !window.collisionDetection;
console.log('collisionDetection set to: ' + window.collisionDetection);
window.savePreference('collisionDetection', window.collisionDetection);
}
// Letter 'A' to increase collision detection radius
if (e.keyCode === 65) {
window.collisionRadiusMultiplier++;
console.log('collisionRadiusMultiplier set to: ' + window.collisionRadiusMultiplier);
window.savePreference('collisionRadiusMultiplier', window.collisionRadiusMultiplier);
}
// Letter 'S' to decrease collision detection radius
if (e.keyCode === 83) {
if (window.collisionRadiusMultiplier > 1) {
window.collisionRadiusMultiplier--;
console.log('collisionRadiusMultiplier set to: ' + window.collisionRadiusMultiplier);
window.savePreference('collisionRadiusMultiplier', window.collisionRadiusMultiplier);
}
}
// Number '8' to toggle defence mode
if (e.keyCode === 56) {
window.defence = !window.defence;
console.log('Defence set to: ' + window.defence);
window.savePreference('defence', window.defence);
}
// Number '9' to reset zoom
if (e.keyCode === 57) {
window.resetZoom();
}
}
};
// Snake width
window.getSnakeWidth = function() {
return window.snake.sc * 15 * window.getScale();
};
// Sorting function for food, from property 'distance'
window.sortFood = function(a, b) {
// a.sz & b.sz - size
// Divide distance by size so bigger food is prioritised over smaller food
return a.distance / a.sz - b.distance / b.sz;
};
// Sorting function for prey, from property 'distance'
window.sortPrey = function(a, b) {
return a.distance - b.distance;
};
// Convert object coordinates to radians
window.getAngleFromObject = function(object) {
var x = object.xx - window.getX();
var y = object.yy - window.getY();
return Math.atan2(x, y);
};
// Polar angle to Cartesian angles
window.getCoordsFromAngle = function(angle) {
var x = Math.cos(angle) * 100;
var y = Math.sin(angle) * 100;
return [x, y];
};
// Given an object (of which properties xx and yy are not null), return the object with an additional property 'distance'
window.getDistanceFromMe = function(point) {
if (point === null) return null;
point.distance = window.getDistance(window.getX(), window.getY(), point.xx, point.yy);
return point;
};
// Get a distance from point (x1; y1) to point (x2; y2).
window.getDistance = function(x1, y1, x2, y2) {
// Calculate the vector coordinates.
var xDistance = (x1 - x2);
var yDistance = (y1 - y2);
// Get the absolute value of each coordinate
xDistance = xDistance < 0 ? xDistance * -1 : xDistance;
yDistance = yDistance < 0 ? yDistance * -1 : yDistance;
//Add the coordinates of the vector to get a distance. Not the real distance, but reliable for distance comparison.
var distance = xDistance + yDistance;
// Real distance but not needed. Here for reference -
// var distance = Math.sqrt(Math.pow(xDistance, 2) + Math.pow(yDistance, 2));
return distance;
};
// Checks to see if you are going to collide with anything in the collision detection radius
window.checkCollision = function(x, y, r) {
var circle1 = collisionScreenToCanvas({
x: x,
y: y,
radius: r
});
if (window.visualDebugging) {
window.drawDot(circle1.x, circle1.y, circle1.radius, 'blue', false);
}
var avoid = false;
var circle2;
for (var snake in window.snakes) {
if (window.snakes[snake].nk != window.snake.nk) {
for (var y = window.snakes[snake].pts.length - 1; 0 <= y; y--) {
if (!window.snakes[snake].pts[y].dying) {
circle2 = {
x: window.snakes[snake].pts[y].xx + window.snakes[snake].fx,
y: window.snakes[snake].pts[y].yy + window.snakes[snake].fy,
radius: 15 * window.snakes[snake].sc * window.getScale()
};
if (window.circleIntersect(circle1, collisionScreenToCanvas(circle2))) {
window.changeGoalCoords(circle2);
avoid = true;
}
}
}
}
}
return avoid;
};
// Screen to Canvas coordinate conversion - used for collision detection
window.collisionScreenToCanvas = function(circle) {
var newCircle = window.mapToMouse(circle.x, circle.y);
newCircle = window.mouseToScreen(newCircle[0], newCircle[1]);
newCircle = window.screenToCanvas(newCircle[0], newCircle[1]);
return {
x: newCircle[0],
y: newCircle[1],
radius: circle.radius
};
};
// Change direction
window.changeGoalCoords = function(circle1) {
if ((circle1.x != window.collisionPoint.x && circle1.y != window.collisionPoint.y)) {
window.collisionPoint = circle1;
window.goalCoordinates = window.mapToMouse(window.snake.xx + (window.snake.xx - window.collisionPoint.x), window.snake.yy + (window.snake.yy - window.collisionPoint.y));
window.setAcceleration(0);
window.setMouseCoordinates(goalCoordinates[0], goalCoordinates[1]);
}
};
// Check if circles intersect
window.circleIntersect = function(circle1, circle2) {
if (quickCollisionCheck(circle1, circle2)) {
if (collisionCheck(circle1, circle2)) {
return true;
} else {
return false;
}
} else {
return false;
}
};
// Quickly check if we are going to collide with anything
window.quickCollisionCheck = function(circle1, circle2) {
return (circle1.x + circle1.radius + circle2.radius > circle2.x &&
circle1.x < circle2.x + circle1.radius + circle2.radius &&
circle1.y + circle1.radius + circle2.radius > circle2.y &&
circle1.y < circle2.y + circle1.radius + circle2.radius);
};
// Collision check
window.collisionCheck = function(circle1, circle2) {
distance = Math.sqrt(((circle1.x - circle2.x) * (circle1.x - circle2.x)) + ((circle1.y - circle2.y) * (circle1.y - circle2.y)));
if (distance < circle1.radius + circle2.radius) {
collisionPointX = ((circle1.x * circle2.radius) + (circle2.x * circle1.radius)) / (circle1.radius + circle2.radius);
collisionPointY = ((circle1.y * circle2.radius) + (circle2.y * circle1.radius)) / (circle1.radius + circle2.radius);
if (window.visualDebugging) {
window.drawDot(collisionPointX, collisionPointY, circle2.radius, 'green', true);
window.drawDot(circle2.x, circle2.y, circle2.radius, 'blue', true);
}
return true;
} else {
return false;
}
};
// Sort food based on distance
window.getSortedFood = function() {
// Filters the nearest food by getting the distance
return window.foods.filter(function(val) {
return val !== null;
}).map(window.getDistanceFromMe).sort(window.sortFood);
};
// Sort prey based on distance
window.getSortedPrey = function() {
// Filters the nearest food by getting the distance
return window.preys.filter(function(val) {
return val !== null;
}).map(window.getDistanceFromMe).sort(window.sortPrey);
};
// Draw dots on the canvas
window.drawDot = function(x, y, radius, colour, fill) {
var context = window.mc.getContext('2d');
context.beginPath();
context.strokeStyle = '#00FF00';
context.arc(x, y, radius * window.getScale(), 0, Math.PI * 2);
context.closePath();
if (fill) {
context.fillStyle = ('green red white yellow black cyan blue'.indexOf(colour) < 0) ? 'white' : colour;
context.fill();
context.fillStyle = 'black';
}
};
// Draw lines on the canvas
window.drawLine = function(x2, y2, colour) {
var context = window.mc.getContext('2d');
var center = [window.mc.height / 2, window.mc.width / 2];
context.lineWidth = 5 * window.getScale();
context.strokeStyle = (colour === 'blue') ? '#0000FF' : '#FF0000';
context.moveTo(center[1], center[0]);
context.lineTo(x2, y2);
context.stroke();
context.strokeStyle = '#000000';
};
// Save the original slither.io oef function so we can add things to it later
window.oldOef = window.oef;
window.oef = function() {
// Original slither.io oef function + whatever is under it
// requestAnimationFrame(window.loop);
window.oldOef();
if (window.isBotRunning) window.loop();
window.onFrameUpdate();
};
window.handleTextColor = function(enabled) {
return '<span style=\"opacity: 0.8; color:' + (enabled ? 'green;\"> ►ON- RandomModzzz.weebly.com' : 'red;\"> ►OFF- RandomModzzz.weebly.com') + '</span>';
};
window.onFrameUpdate = function() {
// Botstatus overlay
var generalStyle = '<span style = "opacity: 0.35";>';
window.botstatus_overlay.innerHTML = generalStyle + '_______________ PRESS (1) TO TOGGLE: Auto Bot: </span>' + window.handleTextColor(window.isBotRunning);
window.visualdebugging_overlay.innerHTML = generalStyle + '|RicH HackS v3.0 | PRESS (2) TO TOGGLE: Visual Target Finder: </span>' + window.handleTextColor(window.visualDebugging);
window.logdebugging_overlay.innerHTML = generalStyle + '|______________| PRESS (3) TO TOGGLE: Log debugging: </span>' + window.handleTextColor(window.logDebugging);
window.autorespawn_overlay.innerHTML = generalStyle + ' PRESS (4) TO TOGGLE: Auto respawn: </span>' + window.handleTextColor(window.autoRespawn);
window.rendermode_overlay.innerHTML = generalStyle + ' PRESS (5) TO TOGGLE: Mobile rendering: </span>' + window.handleTextColor(window.mobileRender);
window.huntprey_overlay.innerHTML = generalStyle + ' PRESS (6) TO TOGGLE: Pretator v1.27: </span>' + window.handleTextColor(window.huntPrey);
window.collision_detection_overlay.innerHTML = generalStyle + ' PRESS (7) TO TOGGLE: Collision detection: </span>' + window.handleTextColor(window.collisionDetection);
window.collision_radius_multiplier_overlay.innerHTML = generalStyle + ' PRESS (A/S) TO TOGGLE: Collision radius multiplier: ' + window.collisionRadiusMultiplier + ' </span>';
window.defence_overlay.innerHTML = generalStyle + ' PRESS (8) TO TOGGLE: Circle Mode: </span>' + window.handleTextColor(window.defence);
window.resetzoom_overlay.innerHTML = generalStyle + ' PRESS(9) TO TOGGLE: Reset zoom </span>';
window.fps_overlay.innerHTML = generalStyle + 'RicH HackS v3.0 Speed Xmade by griffinX: ' + window.framesPerSecond.getFPS() + '</span>';
// If playing
if (window.playing && window.visualDebugging) {
if (window.isBotRunning) {
// Check to see if there is a position overlay
if (window.position_overlay) {
// Display the X and Y of the snake
window.position_overlay.innerHTML = generalStyle + 'X: ' + (Math.round(window.snake.xx) || 0) + ' Y: ' + (Math.round(window.snake.yy) || 0) + '</span>';
}
drawGoalCoordinates = window.mouseToScreen(window.goalCoordinates[0], window.goalCoordinates[1]);
drawGoalCoordinates = window.screenToCanvas(drawGoalCoordinates[0], drawGoalCoordinates[1]);
window.drawLine(drawGoalCoordinates[0], drawGoalCoordinates[1], 'green');
window.drawDot(drawGoalCoordinates[0], drawGoalCoordinates[1], 5, 'red', true);
}
}
};
// Defense mode - bot turns around in a circle
window.playDefence = function(dir) {
window.kd_l = (dir === "l");
window.kd_r = (dir === "r");
window.setMouseCoordinates(window.getWidth() / 2, window.getHeight() / 2);
};
// Actual bot code
// Loop for running the bot
window.loop = function() {
// If the game and the bot are running
if (window.playing && window.isBotEnabled) {
window.ranOnce = true;
// TODO: Check some condition to see if we should play defence
// Right now this just uses the manual toggle
if (window.defence) {
window.playDefence("l");
return;
}
// If no enemies or obstacles, go after what you are going after
if (!window.checkCollision(window.getX(), window.getY(), window.getSnakeWidth()*window.collisionRadiusMultiplier)) {
// Sort the food based on their distance relative to player's snake
window.sortedFood = window.getSortedFood();
// Current food
window.currentFood = window.sortedFood[0];
// Convert coordinates of the closest food using mapToMouse
var coordinatesOfClosestFood = window.mapToMouse(window.currentFood.xx, window.currentFood.yy);
window.goalCoordinates = coordinatesOfClosestFood;
// Disable Sprint
window.setAcceleration(0);
// Check for preys, enough "length"
if (window.preys.length > 0 && window.huntPrey) {
// Sort preys based on their distance relative to player's snake
window.sortedPrey = window.getSortedPrey();
// Current prey
window.currentPrey = window.sortedPrey[0];
// Convert coordinates of the closest prey using mapToMouse
var coordinatesOfClosestPrey = window.mapToMouse(window.currentPrey.xx, window.currentPrey.yy);
// Check for the distance
if (window.currentPrey.distance <= Math.pow(window.getSnakeLength(), 2) / 2) {
// Set the mouse coordinates to the coordinates of the closest prey
window.goalCoordinates = coordinatesOfClosestPrey;
// "Sprint" enabled
window.setAcceleration(1);
}
}
window.kd_l = false;
window.kd_r = false;
window.setMouseCoordinates(window.goalCoordinates[0], window.goalCoordinates[1]);
}
} else {
if (window.ranOnce) {
//window.startInterval = setInterval(window.startBot, 1000);
window.stopBot();
}
}
};
// Target the user's browser.
(function() {
var requestAnimationFrame = window.requestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.msRequestAnimationFrame;
window.requestAnimationFrame = requestAnimationFrame;
})();
// Starts bot
window.startBot = function() {
if (window.autoRespawn && !window.playing && window.isBotEnabled && window.ranOnce && !window.isBotRunning) {
window.connectBot();
//clearInterval(window.startInterval);
}
};
// Initialises the bot
window.initBot = function() {
window.ranOnce = false;
window.isBotRunning = false;
window.isBotEnabled = true;
window.collisionPoint = {
x: 0,
y: 0,
radius: 0
};
// Load preferences
window.loadPreference('logDebugging', false);
window.loadPreference('visualDebugging', false);
window.loadPreference('autoRespawn', false);
window.loadPreference('mobileRender', false);
window.loadPreference('huntPrey', true);
window.loadPreference('collisionDetection', true);
window.loadPreference('collisionRadiusMultiplier', 8);
window.loadPreference('defence', false);
window.nick.value = window.loadPreference('savedNick', 'Slitheriogameplay.com Bot!');
// Overlays
// Top left
window.generalstyle = 'color: #FFF; font-family: Arial, \'Helvetica Neue\', Helvetica, sans-serif; font-size: 14px; position: fixed; z-index: 7;';
window.appendDiv('botstatus_overlay', 'nsi', window.generalstyle + 'left: 30; top: 30px;');
window.appendDiv('visualdebugging_overlay', 'nsi', window.generalstyle + 'left: 30; top: 45px;');
window.appendDiv('logdebugging_overlay', 'nsi', window.generalstyle + 'left: 30; top: 60px;');
window.appendDiv('autorespawn_overlay', 'nsi', window.generalstyle + 'left: 30; top: 75px;');
window.appendDiv('rendermode_overlay', 'nsi', window.generalstyle + 'left: 30; top: 90px;');
window.appendDiv('huntprey_overlay', 'nsi', window.generalstyle + 'left: 30; top: 105px;');
window.appendDiv('collision_detection_overlay', 'nsi', window.generalstyle + 'left: 30; top: 120px;');
window.appendDiv('collision_radius_multiplier_overlay', 'nsi', window.generalstyle + 'left: 30; top: 135px;');
window.appendDiv('defence_overlay', 'nsi', window.generalstyle + 'left: 30; top: 150px;');
window.appendDiv('resetzoom_overlay', 'nsi', window.generalstyle + 'left: 30; top: 165px;');
// Bottom right
window.appendDiv('position_overlay', 'nsi', window.generalstyle + 'right: 30; bottom: 120px;');
window.appendDiv('fps_overlay', 'nsi', window.generalstyle + 'right: 30; bottom: 170px;');
// Listener for mouse wheel scroll - used for setZoom function
document.body.addEventListener('mousewheel', window.setZoom);
document.body.addEventListener('DOMMouseScroll', window.setZoom);
// Set render mode
if (window.mobileRender) {
setBackground('data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs');
window.render_mode = 1;
} else {
setBackground();
window.render_mode = 2;
}
// Canvas Ratio
window.canvasRatio = [window.mc.width / window.getWidth(), window.mc.height / window.getHeight()];
// Unblocks all skins without the need for FB sharing.
window.localStorage.setItem('edttsg', '1');
// Remove social
window.social.remove();
// Start!
window.launchBot(50);
window.startInterval = setInterval(window.startBot, 1000);
};
window.initBot();
// Enemy code - not used for now
/*
// Sort enemies based on distance
window.getSortedEnemies = function() {
Filters the nearest food by getting the distance
return window.snakes.filter(function(val) {
return val !== null && val.id !== window.snake.id;
}).map(window.getDistanceFromMe).sort(window.sortEnemy);
};
// Sorting function for enemies, from property 'distance'
window.sortEnemy = function(a, b) {
return a.distance - b.distance;
};
window.sortedEnemies = window.getSortedEnemies();
// Take the closest of each
window.closestEnemy = window.sortedEnemies[0];
if (window.closestEnemy.distance < 300) {
window.log('close enemy! (distance = ' + window.closestEnemy.distance);
// !handle close enemies!
}
*/
// Better food hunting algorithm but not implemented yet
/*
window.isInFoods = function (foodObject) {
return (foodObject === null) ? false : (window.foods.indexOf(foodObject) >= 0);
};
window.currentFood = null;
window.sortedFood = getSortedFood();
window.loop = function () {
if (!isInFoods(currentFood)) {
window.sortedFood = getSortedFood();
window.currentFood = sortedFood[0];
var coordinatesOfClosestFood = window.mapToMouse(window.sortedFood[0].xx, window.sortedFood[0].yy);
window.setMouseCoordinates(coordinatesOfClosestFood[0], coordinatesOfClosestFood[1]);
}
};
*/