Skip to content

Instantly share code, notes, and snippets.

@BySayko
Last active February 12, 2017 14:54
Show Gist options
  • Save BySayko/d709b0b2a3ea8318e985 to your computer and use it in GitHub Desktop.
Save BySayko/d709b0b2a3ea8318e985 to your computer and use it in GitHub Desktop.
bot.user.js BoomBap
Number.prototype.mod = function(n) {
return ((this % n) + n) % n;
};
Array.prototype.peek = function() {
return this[this.length - 1];
};
$.get('https://raw.githubusercontent.com/Apostolique/Agar.io-bot/master/bot.user.js?1', function(data) {
var latestVersion = data.replace(/(\r\n|\n|\r)/gm,"");
latestVersion = latestVersion.substring(latestVersion.indexOf("// @version")+11,latestVersion.indexOf("// @grant"));
latestVersion = parseFloat(latestVersion + 0.0000);
var myVersion = parseFloat(GM_info.script.version + 0.0000);
if(latestVersion > myVersion)
{
alert("Yeni bir UPDATE var: bot.user.js: V" + latestVersion + "\nGeni Update icin Boombap.com'a girin");
window.open('https://boombap.com','_blank');
}
console.log('Current bot.user.js Version: ' + myVersion + " on Github: " + latestVersion);
});
console.log("Running Apos Bot!");
(function(f, g) {
var splitDistance = 710;
console.log("Apos Bot!");
if (f.botList == null) {
f.botList = [];
g('#locationUnknown').append(g('<select id="bList" class="form-control" onchange="setBotIndex($(this).val());" />'));
g('#locationUnknown').addClass('form-group');
}
f.botList.push(["AposBot", findDestination]);
var bList = g('#bList');
g('<option />', {value: (f.botList.length - 1), text: "BoomBapBOT"}).appendTo(bList);
//Given an angle value that was gotten from valueAndleBased(),
//returns a new value that scales it appropriately.
function paraAngleValue(angleValue, range) {
return (15 / (range[1])) * (angleValue * angleValue) - (range[1] / 6);
}
function valueAngleBased(angle, range) {
var leftValue = (angle - range[0]).mod(360);
var rightValue = (rangeToAngle(range) - angle).mod(360);
var bestValue = Math.min(leftValue, rightValue);
if (bestValue <= range[1]) {
return paraAngleValue(bestValue, range);
}
var banana = -1;
return banana;
}
function computeDistance(x1, y1, x2, y2) {
var xdis = x1 - x2; // <--- FAKE AmS OF COURSE!
var ydis = y1 - y2;
var distance = Math.sqrt(xdis * xdis + ydis * ydis);
return distance;
}
function computerDistanceFromCircleEdge(x1, y1, x2, y2, s2) {
var tempD = computeDistance(x2, y2, x1, y1);
var offsetX = 0;
var offsetY = 0;
var ratioX = tempD / (x2 - x1);
var ratioY = tempD / (y2 - y1);
offsetX = x2 - (s2 / ratioX);
offsetY = y2 - (s2 / ratioY);
return computeDistance(x1, y1, offsetX, offsetY);
}
function getListBasedOnFunction(booleanFunction, listToUse) {
var dotList = [];
var interNodes = getMemoryCells();
Object.keys(listToUse).forEach(function(element, index) {
if (booleanFunction(element)) {
dotList.push(interNodes[element]);
}
});
return dotList;
}
function compareSize(player1, player2, ratio) {
if (player1.size * player1.size * ratio < player2.size * player2.size) {
return true;
}
return false;
}
function canSplit(player1, player2) {
return compareSize(player1, player2, 2.30) && !compareSize(player1, player2, 9);
}
function processEverything(listToUse) {
Object.keys(listToUse).forEach(function(element, index) {
computeAngleRanges(listToUse[element], getPlayer()[0]);
});
}
function getAll() {
var dotList = [];
var player = getPlayer();
var interNodes = getMemoryCells();
dotList = getListBasedOnFunction(function(element) {
var isMe = false;
for (var i = 0; i < player.length; i++) {
if (interNodes[element].id == player[i].id) {
isMe = true;
break;
}
}
if (!isMe) {
return true;
}
return false;
}, interNodes);
return dotList;
}
function getAllViruses(blob) {
var dotList = [];
var player = getPlayer();
var interNodes = getMemoryCells();
dotList = getListBasedOnFunction(function(element) {
var isMe = false;
for (var i = 0; i < player.length; i++) {
if (interNodes[element].id == player[i].id) {
isMe = true;
break;
}
}
if (!isMe && interNodes[element].d && compareSize(interNodes[element], blob, 1.30)) {
return true;
}
return false;
}, interNodes);
return dotList;
}
function getAllThreats(blob) {
var dotList = [];
var player = getPlayer();
var interNodes = getMemoryCells();
dotList = getListBasedOnFunction(function(element) {
var isMe = false;
for (var i = 0; i < player.length; i++) {
if (interNodes[element].id == player[i].id) {
isMe = true;
break;
}
}
if (!isMe && (!interNodes[element].d && compareSize(blob, interNodes[element], 1.30))) {
return true;
}
return false;
}, interNodes);
return dotList;
}
function getAllFood(blob) {
var elementList = [];
var dotList = [];
var player = getPlayer();
var interNodes = getMemoryCells();
elementList = getListBasedOnFunction(function(element) {
var isMe = false;
for (var i = 0; i < player.length; i++) {
if (interNodes[element].id == player[i].id) {
isMe = true;
break;
}
}
if (!isMe && !interNodes[element].d && compareSize(interNodes[element], blob, 1.30) || (interNodes[element].size <= 11)) {
return true;
} else {
return false;
}
}, interNodes);
for (var i = 0; i < elementList.length; i++) {
dotList.push([elementList[i].x, elementList[i].y, elementList[i].size]);
}
return dotList;
}
function clusterFood(foodList, blobSize) {
var clusters = [];
var addedCluster = false;
//1: x
//2: y
//3: size or value
//4: Angle, not set here.
for (var i = 0; i < foodList.length; i++) {
for (var j = 0; j < clusters.length; j++) {
if (computeDistance(foodList[i][0], foodList[i][1], clusters[j][0], clusters[j][1]) < blobSize * 1.5) {
clusters[j][0] = (foodList[i][0] + clusters[j][0]) / 2;
clusters[j][1] = (foodList[i][1] + clusters[j][1]) / 2;
clusters[j][2] += foodList[i][2];
addedCluster = true;
break;
}
}
if (!addedCluster) {
clusters.push([foodList[i][0], foodList[i][1], foodList[i][2], 0]);
}
addedCluster = false;
}
return clusters;
}
function getAngle(x1, y1, x2, y2) {
//Handle vertical and horizontal lines.
if (x1 == x2) {
if (y1 < y2) {
return 271;
//return 89;
} else {
return 89;
}
}
return (Math.round(Math.atan2(-(y1 - y2), -(x1 - x2)) / Math.PI * 180 + 180));
}
function slope(x1, y1, x2, y2) {
var m = (y1 - y2) / (x1 - x2);
return m;
}
function slopeFromAngle(degree) {
if (degree == 270) {
degree = 271;
} else if (degree == 90) {
degree = 91;
}
return Math.tan((degree - 180) / 180 * Math.PI);
}
//Given two points on a line, finds the slope of a perpendicular line crossing it.
function inverseSlope(x1, y1, x2, y2) {
var m = slope(x1, y1, x2, y2);
return (-1) / m;
}
//Given a slope and an offset, returns two points on that line.
function pointsOnLine(slope, useX, useY, distance) {
var b = useY - slope * useX;
var r = Math.sqrt(1 + slope * slope);
var newX1 = (useX + (distance / r));
var newY1 = (useY + ((distance * slope) / r));
var newX2 = (useX + ((-distance) / r));
var newY2 = (useY + (((-distance) * slope) / r));
return [
[newX1, newY1],
[newX2, newY2]
];
}
function followAngle(angle, useX, useY, distance) {
var slope = slopeFromAngle(angle);
var coords = pointsOnLine(slope, useX, useY, distance);
var side = (angle - 90).mod(360);
if (side < 180) {
return coords[1];
} else {
return coords[0];
}
}
//Using a line formed from point a to b, tells if point c is on S side of that line.
function isSideLine(a, b, c) {
if ((b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]) > 0) {
return true;
}
return false;
}
//angle range2 is within angle range2
//an Angle is a point and a distance between an other point [5, 40]
function angleRangeIsWithin(range1, range2) {
if (range2[0] == (range2[0] + range2[1]).mod(360)) {
return true;
}
//console.log("r1: " + range1[0] + ", " + range1[1] + " ... r2: " + range2[0] + ", " + range2[1]);
var distanceFrom0 = (range1[0] - range2[0]).mod(360);
var distanceFrom1 = (range1[1] - range2[0]).mod(360);
if (distanceFrom0 < range2[1] && distanceFrom1 < range2[1] && distanceFrom0 < distanceFrom1) {
return true;
}
return false;
}
function angleRangeIsWithinInverted(range1, range2) {
var distanceFrom0 = (range1[0] - range2[0]).mod(360);
var distanceFrom1 = (range1[1] - range2[0]).mod(360);
if (distanceFrom0 < range2[1] && distanceFrom1 < range2[1] && distanceFrom0 > distanceFrom1) {
return true;
}
return false;
}
function angleIsWithin(angle, range) {
var diff = (rangeToAngle(range) - angle).mod(360);
if (diff >= 0 && diff <= range[1]) {
return true;
}
return false;
}
function rangeToAngle(range) {
return (range[0] + range[1]).mod(360);
}
function anglePair(range) {
return (range[0] + ", " + rangeToAngle(range) + " range: " + range[1]);
}
function computeAngleRanges(blob1, blob2) {
var mainAngle = getAngle(blob1.x, blob1.y, blob2.x, blob2.y);
var leftAngle = (mainAngle - 90).mod(360);
var rightAngle = (mainAngle + 90).mod(360);
var blob1Left = followAngle(leftAngle, blob1.x, blob1.y, blob1.size);
var blob1Right = followAngle(rightAngle, blob1.x, blob1.y, blob1.size);
var blob2Left = followAngle(rightAngle, blob2.x, blob2.y, blob2.size);
var blob2Right = followAngle(leftAngle, blob2.x, blob2.y, blob2.size);
var blob1AngleLeft = getAngle(blob2.x, blob2.y, blob1Left[0], blob1Left[1]);
var blob1AngleRight = getAngle(blob2.x, blob2.y, blob1Right[0], blob1Right[1]);
var blob2AngleLeft = getAngle(blob1.x, blob1.y, blob2Left[0], blob2Left[1]);
var blob2AngleRight = getAngle(blob1.x, blob1.y, blob2Right[0], blob2Right[1]);
var blob1Range = (blob1AngleRight - blob1AngleLeft).mod(360);
var blob2Range = (blob2AngleRight - blob2AngleLeft).mod(360);
var tempLine = followAngle(blob2AngleLeft, blob2Left[0], blob2Left[1], 400);
//drawLine(blob2Left[0], blob2Left[1], tempLine[0], tempLine[1], 0);
if ((blob1Range / blob2Range) > 1) {
drawPoint(blob1Left[0], blob1Left[1], 3, "");
drawPoint(blob1Right[0], blob1Right[1], 3, "");
drawPoint(blob1.x, blob1.y, 3, "" + blob1Range + ", " + blob2Range + " R: " + (Math.round((blob1Range / blob2Range) * 1000) / 1000));
}
//drawPoint(blob2.x, blob2.y, 3, "" + blob1Range);
}
function debugAngle(angle, text) {
var player = getPlayer();
var line1 = followAngle(angle, player[0].x, player[0].y, 300);
drawLine(player[0].x, player[0].y, line1[0], line1[1], 5);
drawPoint(line1[0], line1[1], 5, "" + text);
}
function getEdgeLinesFromPoint(blob1, blob2) {
// find tangents
//
// TODO: DON'T FORGET TO HANDLE IF BLOB1'S CENTER POINT IS INSIDE BLOB2!!!
var px = blob1.x;
var py = blob1.y;
var cx = blob2.x;
var cy = blob2.y;
var radius = blob2.size;
if (blob2.d) {
radius = blob1.size;
} else if(canSplit(blob1, blob2)) {
radius += splitDistance;
} else {
radius += blob1.size * 2;
}
var shouldInvert = false;
if (computeDistance(px, py, cx, cy) <= radius) {
radius = computeDistance(px, py, cx, cy) - 5;
shouldInvert = true;
}
var dx = cx - px;
var dy = cy - py;
var dd = Math.sqrt(dx * dx + dy * dy);
var a = Math.asin(radius / dd);
var b = Math.atan2(dy, dx);
var t = b - a;
var ta = {
x: radius * Math.sin(t),
y: radius * -Math.cos(t)
};
t = b + a;
var tb = {
x: radius * -Math.sin(t),
y: radius * Math.cos(t)
};
var angleLeft = getAngle(cx + ta.x, cy + ta.y, px, py);
var angleRight = getAngle(cx + tb.x, cy + tb.y, px, py);
var angleDistance = (angleRight - angleLeft).mod(360);
if (shouldInvert) {
var temp = angleLeft;
angleLeft = (angleRight + 180).mod(360);
angleRight = (temp + 180).mod(360);
angleDistance = (angleRight - angleLeft).mod(360);
}
return [angleLeft, angleDistance, [cx + tb.x, cy + tb.y],
[cx + ta.x, cy + ta.y]
];
}
function invertAngle(range) {
var angle1 = rangeToAngle(badAngles[i]);
var angle2 = (badAngles[i][0] - angle1).mod(360);
return [angle1, angle2];
}
function addWall(listToUse, blob) {
if (blob.x < f.getMapStartX() + 1000) {
//LEFT
//console.log("Left");
listToUse.push([[135, true], [225, false]]);
var lineLeft = followAngle(135, blob.x, blob.y, 190 + blob.size);
var lineRight = followAngle(225, blob.x, blob.y, 190 + blob.size);
drawLine(blob.x, blob.y, lineLeft[0], lineLeft[1], 5);
drawLine(blob.x, blob.y, lineRight[0], lineRight[1], 5);
drawArc(lineLeft[0], lineLeft[1], lineRight[0], lineRight[1], blob.x, blob.y, 5);
}
if (blob.y < f.getMapStartY() + 1000) {
//TOP
//console.log("TOP");
listToUse.push([[225, true], [315, false]]);
var lineLeft = followAngle(225, blob.x, blob.y, 190 + blob.size);
var lineRight = followAngle(315, blob.x, blob.y, 190 + blob.size);
drawLine(blob.x, blob.y, lineLeft[0], lineLeft[1], 5);
drawLine(blob.x, blob.y, lineRight[0], lineRight[1], 5);
drawArc(lineLeft[0], lineLeft[1], lineRight[0], lineRight[1], blob.x, blob.y, 5);
}
if (blob.x > f.getMapEndX() - 1000) {
//RIGHT
//console.log("RIGHT");
listToUse.push([[315, true], [45, false]]);
var lineLeft = followAngle(315, blob.x, blob.y, 190 + blob.size);
var lineRight = followAngle(45, blob.x, blob.y, 190 + blob.size);
drawLine(blob.x, blob.y, lineLeft[0], lineLeft[1], 5);
drawLine(blob.x, blob.y, lineRight[0], lineRight[1], 5);
drawArc(lineLeft[0], lineLeft[1], lineRight[0], lineRight[1], blob.x, blob.y, 5);
}
if (blob.y > f.getMapEndY() - 1000) {
//BOTTOM
//console.log("BOTTOM");
listToUse.push([[45, true], [135, false]]);
var lineLeft = followAngle(45, blob.x, blob.y, 190 + blob.size);
var lineRight = followAngle(135, blob.x, blob.y, 190 + blob.size);
drawLine(blob.x, blob.y, lineLeft[0], lineLeft[1], 5);
drawLine(blob.x, blob.y, lineRight[0], lineRight[1], 5);
drawArc(lineLeft[0], lineLeft[1], lineRight[0], lineRight[1], blob.x, blob.y, 5);
}
return listToUse;
}
//listToUse contains angles in the form of [angle, boolean].
//boolean is true when the range is starting. False when it's ending.
//range = [[angle1, true], [angle2, false]]
function getAngleIndex(listToUse, angle) {
if (listToUse.length == 0) {
return 0;
}
for (var i = 0; i < listToUse.length; i++) {
if (angle <= listToUse[i][0]) {
return i;
}
}
return listToUse.length;
}
function addAngle(listToUse, range) {
//#1 Find first open element
//#2 Try to add range1 to the list. If it is within other range, don't add it, set a boolean.
//#3 Try to add range2 to the list. If it is withing other range, don't add it, set a boolean.
//TODO: Only add the new range at the end after the right stuff has been removed.
var startIndex = 1;
if (listToUse.length > 0 && !listToUse[0][1]) {
startIndex = 0;
}
var startMark = getAngleIndex(listToUse, range[0][0]);
var startBool = startMark.mod(2) != startIndex;
var endMark = getAngleIndex(listToUse, range[1][0]);
var endBool = endMark.mod(2) != startIndex;
var removeList = [];
if (startMark != endMark) {
//Note: If there is still an error, this would be it.
var biggerList = 0;
if (endMark == listToUse.length) {
biggerList = 1;
}
for (var i = startMark; i < startMark + (endMark - startMark).mod(listToUse.length + biggerList); i++) {
removeList.push((i).mod(listToUse.length));
}
} else if (startMark < listToUse.length && endMark < listToUse.length) {
var startDist = (listToUse[startMark][0] - range[0][0]).mod(360);
var endDist = (listToUse[endMark][0] - range[1][0]).mod(360);
if (startDist < endDist) {
for (var i = 0; i < listToUse.length; i++) {
removeList.push(i);
}
}
}
removeList.sort(function(a, b){return b-a});
for (var i = 0; i < removeList.length; i++) {
listToUse.splice(removeList[i], 1);
}
if (startBool) {
listToUse.splice(getAngleIndex(listToUse, range[0][0]), 0, range[0]);
}
if (endBool) {
listToUse.splice(getAngleIndex(listToUse, range[1][0]), 0, range[1]);
}
return listToUse;
}
function getAngleRange(blob1, blob2, index) {
var angleStuff = getEdgeLinesFromPoint(blob1, blob2);
var leftAngle = angleStuff[0];
var rightAngle = rangeToAngle(angleStuff);
var difference = angleStuff[1];
drawPoint(angleStuff[2][0], angleStuff[2][1], 3, "");
drawPoint(angleStuff[3][0], angleStuff[3][1], 3, "");
//console.log("Adding badAngles: " + leftAngle + ", " + rightAngle + " diff: " + difference);
var lineLeft = followAngle(leftAngle, blob1.x, blob1.y, 150 + blob1.size - index * 10);
var lineRight = followAngle(rightAngle, blob1.x, blob1.y, 150 + blob1.size - index * 10);
if (blob2.d) {
drawLine(blob1.x, blob1.y, lineLeft[0], lineLeft[1], 6);
drawLine(blob1.x, blob1.y, lineRight[0], lineRight[1], 6);
drawArc(lineLeft[0], lineLeft[1], lineRight[0], lineRight[1], blob1.x, blob1.y, 6);
} else if(getCells().hasOwnProperty(blob2.id)) {
drawLine(blob1.x, blob1.y, lineLeft[0], lineLeft[1], 0);
drawLine(blob1.x, blob1.y, lineRight[0], lineRight[1], 0);
drawArc(lineLeft[0], lineLeft[1], lineRight[0], lineRight[1], blob1.x, blob1.y, 0);
} else {
drawLine(blob1.x, blob1.y, lineLeft[0], lineLeft[1], 3);
drawLine(blob1.x, blob1.y, lineRight[0], lineRight[1], 3);
drawArc(lineLeft[0], lineLeft[1], lineRight[0], lineRight[1], blob1.x, blob1.y, 3);
}
return [leftAngle, difference];
}
//Given a list of conditions, shift the angle to the closest available spot respecting the range given.
function shiftAngle(listToUse, angle, range) {
//TODO: shiftAngle needs to respect the range!
for (var i = 0; i < listToUse.length; i++) {
if (angleIsWithin(angle, listToUse[i])) {
//console.log("Shifting needed!");
var angle1 = listToUse[i][0];
var angle2 = rangeToAngle(listToUse[i]);
var dist1 = (angle - angle1).mod(360);
var dist2 = (angle2 - angle).mod(360);
if (dist1 < dist2) {
return angle1;
} else {
return angle2;
}
}
}
//console.log("No Shifting Was needed!");
return angle;
}
function findDestination(followMouse) {
var player = getPlayer();
var interNodes = getMemoryCells();
if ( /*!toggle*/ 1) {
var useMouseX = (getMouseX() - getWidth() / 2 + getX() * getRatio()) / getRatio();
var useMouseY = (getMouseY() - getHeight() / 2 + getY() * getRatio()) / getRatio();
tempPoint = [useMouseX, useMouseY, 1];
var tempMoveX = getPointX();
var tempMoveY = getPointY();
if (player.length > 0) {
for (var k = 0; k < player.length; k++) {
//console.log("Working on blob: " + k);
drawCircle(player[k].x, player[k].y, player[k].size + splitDistance, 5);
//drawPoint(player[0].x, player[0].y - player[0].size, 3, "" + Math.floor(player[0].x) + ", " + Math.floor(player[0].y));
//var allDots = processEverything(interNodes);
var allPossibleFood = null;
allPossibleFood = getAllFood(player[k]); // #1
var allPossibleThreats = getAllThreats(player[k]);
//console.log("Internodes: " + interNodes.length + " Food: " + allPossibleFood.length + " Threats: " + allPossibleThreats.length);
var allPossibleViruses = getAllViruses(player[k]);
var badAngles = [];
var isSafeSpot = true;
var isMouseSafe = true;
var clusterAllFood = clusterFood(allPossibleFood, player[k].size);
//console.log("Looking for enemies!");
for (var i = 0; i < allPossibleThreats.length; i++) {
var enemyDistance = computeDistance(allPossibleThreats[i].x, allPossibleThreats[i].y, player[k].x, player[k].y);
//console.log("Found distance.");
for (var j = clusterAllFood.length - 1; j >= 0 ; j--) {
var secureDistance = (canSplit(player[k], allPossibleThreats[i]) ? splitDistance : player[k].size*2) + allPossibleThreats
[i].size;
if (computeDistance(allPossibleThreats[i].x, allPossibleThreats[i].y, clusterAllFood[j][0], clusterAllFood[j][1]) <
secureDistance)
clusterAllFood.splice(j, 1);
}
//console.log("Removed some food.");
if (canSplit(player[k], allPossibleThreats[i])) {
drawCircle(allPossibleThreats[i].x, allPossibleThreats[i].y, allPossibleThreats[i].size + splitDistance, 0);
} else {
drawCircle(allPossibleThreats[i].x, allPossibleThreats[i].y, allPossibleThreats[i].size + player[k].size + player[k].size, 3);
}
if (allPossibleThreats[i].danger && f.getLastUpdate() - allPossibleThreats[i].dangerTimeOut > 1000) {
allPossibleThreats[i].danger = false;
}
if ((canSplit(player[k], allPossibleThreats[i]) && enemyDistance < allPossibleThreats[i].size + splitDistance + player[k].size) ||
(!canSplit(player[k], allPossibleThreats[i]) && enemyDistance < allPossibleThreats[i].size + player[k].size + player[k].size)) {
allPossibleThreats[i].danger = true;
allPossibleThreats[i].dangerTimeOut = f.getLastUpdate();
}
//console.log("Figured out who was important.");
if ((canSplit(player[k], allPossibleThreats[i]) && enemyDistance < allPossibleThreats[i].size + splitDistance + player[k].size) ||
(!canSplit(player[k], allPossibleThreats[i]) && enemyDistance < allPossibleThreats[i].size + player[k].size) || allPossibleThreats[i].danger) {
badAngles.push(getAngleRange(player[k], allPossibleThreats[i], i));
//drawPoint(lineLeft[0], lineLeft[1], 0, "Left 0 - " + i);
//drawPoint(lineRight[0], lineRight[1], 0, "Right 1 - " + i);
}
//console.log("Done with enemy: " + i);
}
//console.log("Done looking for enemies!");
var goodAngles = [];
var stupidList = [];
var obstacleList = [];
for (var i = 0; i < allPossibleViruses.length; i++) {
var tempOb = getAngleRange(player[k], allPossibleViruses[i], i);
var angle1 = tempOb[0];
var angle2 = rangeToAngle(tempOb);
drawCircle(allPossibleViruses[i].x, allPossibleViruses[i].y, player[k].size, 6);
obstacleList.push([[angle1, true], [angle2, false]]);
}
if (badAngles.length > 0) {
//NOTE: This is only bandaid wall code. It's not the best way to do it.
stupidList = addWall(stupidList, player[k]);
}
for (var i = 0; i < badAngles.length; i++) {
var angle1 = badAngles[i][0];
var angle2 = rangeToAngle(badAngles[i]);
stupidList.push([[angle1, true], [angle2, false]]);
}
//stupidList.push([[45, true], [135, false]]);
//stupidList.push([[10, true], [200, false]]);
//console.log("Added random noob stuff.");
var sortedInterList = [];
var sortedObList = [];
for (var i = 0; i < stupidList.length; i++) {
//console.log("Adding to sorted: " + stupidList[i][0][0] + ", " + stupidList[i][1][0]);
sortedInterList = addAngle(sortedInterList, stupidList[i]);
if (sortedInterList.length == 0) {
break;
}
}
for (var i = 0; i < obstacleList.length; i++) {
sortedObList = addAngle(sortedObList, obstacleList[i]);
if (sortedObList.length == 0) {
break;
}
}
var offsetI = 0;
var obOffsetI = 1;
if (sortedInterList.length > 0 && sortedInterList[0][1]) {
offsetI = 1;
}
if (sortedObList.length > 0 && sortedObList[0][1]) {
obOffsetI = 0;
}
var goodAngles = [];
var obstacleAngles = [];
for (var i = 0; i < sortedInterList.length; i += 2) {
var angle1 = sortedInterList[(i + offsetI).mod(sortedInterList.length)][0];
var angle2 = sortedInterList[(i + 1 + offsetI).mod(sortedInterList.length)][0];
var diff = (angle2 - angle1).mod(360);
goodAngles.push([angle1, diff]);
}
for (var i = 0; i < sortedObList.length; i += 2) {
var angle1 = sortedObList[(i + obOffsetI).mod(sortedObList.length)][0];
var angle2 = sortedObList[(i + 1 + obOffsetI).mod(sortedObList.length)][0];
var diff = (angle2 - angle1).mod(360);
obstacleAngles.push([angle1, diff]);
}
for (var i = 0; i < goodAngles.length; i++) {
var line1 = followAngle(goodAngles[i][0], player[k].x, player[k].y, 100 + player[k].size);
var line2 = followAngle((goodAngles[i][0] + goodAngles[i][1]).mod(360), player[k].x, player[k].y, 100 + player[k].size);
drawLine(player[k].x, player[k].y, line1[0], line1[1], 1);
drawLine(player[k].x, player[k].y, line2[0], line2[1], 1);
drawArc(line1[0], line1[1], line2[0], line2[1], player[k].x, player[k].y, 1);
//drawPoint(player[0].x, player[0].y, 2, "");
drawPoint(line1[0], line1[1], 0, "" + i + ": 0");
drawPoint(line2[0], line2[1], 0, "" + i + ": 1");
}
for (var i = 0; i < obstacleAngles.length; i++) {
var line1 = followAngle(obstacleAngles[i][0], player[k].x, player[k].y, 50 + player[k].size);
var line2 = followAngle((obstacleAngles[i][0] + obstacleAngles[i][1]).mod(360), player[k].x, player[k].y, 50 + player[k].size);
drawLine(player[k].x, player[k].y, line1[0], line1[1], 6);
drawLine(player[k].x, player[k].y, line2[0], line2[1], 6);
drawArc(line1[0], line1[1], line2[0], line2[1], player[k].x, player[k].y, 6);
//drawPoint(player[0].x, player[0].y, 2, "");
drawPoint(line1[0], line1[1], 0, "" + i + ": 0");
drawPoint(line2[0], line2[1], 0, "" + i + ": 1");
}
if (goodAngles.length > 0) {
var bIndex = goodAngles[0];
var biggest = goodAngles[0][1];
for (var i = 1; i < goodAngles.length; i++) {
var size = goodAngles[i][1];
if (size > biggest) {
biggest = size;
bIndex = goodAngles[i];
}
}
var perfectAngle = (bIndex[0] + bIndex[1] / 2).mod(360);
perfectAngle = shiftAngle(obstacleAngles, perfectAngle, bIndex);
var line1 = followAngle(perfectAngle, player[k].x, player[k].y, 300);
drawLine(player[k].x, player[k].y, line1[0], line1[1], 7);
tempMoveX = line1[0];
tempMoveY = line1[1];
} else if (badAngles.length > 0 && goodAngles == 0) {
//TODO: CODE TO HANDLE WHEN THERE IS NO GOOD ANGLE BUT THERE ARE ENEMIES AROUND!!!!!!!!!!!!!
} else if (clusterAllFood.length > 0) {
for (var i = 0; i < clusterAllFood.length; i++) {
//console.log("mefore: " + clusterAllFood[i][2]);
//This is the cost function. Higher is better.
var clusterAngle = getAngle(clusterAllFood[i][0], clusterAllFood[i][1], player[k].x, player[k].y);
clusterAllFood[i][2] = clusterAllFood[i][2] * 6 - computeDistance(clusterAllFood[i][0], clusterAllFood[i][1], player[k].x,
player[k].y);
//console.log("Current Value: " + clusterAllFood[i][2]);
//(goodAngles[bIndex][1] / 2 - (Math.abs(perfectAngle - clusterAngle)));
clusterAllFood[i][3] = clusterAngle;
drawPoint(clusterAllFood[i][0], clusterAllFood[i][1], 1, "");
//console.log("After: " + clusterAllFood[i][2]);
}
var bestFoodI = 0;
var bestFood = clusterAllFood[0][2];
for (var i = 1; i < clusterAllFood.length; i++) {
if (bestFood < clusterAllFood[i][2]) {
bestFood = clusterAllFood[i][2];
bestFoodI = i;
}
}
//console.log("Best Value: " + clusterAllFood[bestFoodI][2]);
var distance = computeDistance(player[k].x, player[k].y, clusterAllFood[bestFoodI][0], clusterAllFood[bestFoodI][1]);
var shiftedAngle = shiftAngle(obstacleAngles, getAngle(clusterAllFood[bestFoodI][0], clusterAllFood[bestFoodI][1], player[k].x,
player[k].y), [0, 360]);
var destination = followAngle(shiftedAngle, player[k].x, player[k].y, distance);
tempMoveX = destination[0];
tempMoveY = destination[1];
drawLine(player[k].x, player[k].y, tempMoveX, tempMoveY, 1);
} else {
//If there are no enemies around and no food to eat.
}
drawPoint(tempPoint[0], tempPoint[1], tempPoint[2], "");
//drawPoint(tempPoint[0], tempPoint[1], tempPoint[2], "" + Math.floor(computeDistance(tempPoint[0], tempPoint[1], I, J)));
//drawLine(tempPoint[0], tempPoint[1], player[0].x, player[0].y, 6);
//console.log("Slope: " + slope(tempPoint[0], tempPoint[1], player[0].x, player[0].y) + " Angle: " + getAngle(tempPoint[0], tempPoint[1],
player[0].x, player[0].y) + " Side: " + (getAngle(tempPoint[0], tempPoint[1], player[0].x, player[0].y) - 90).mod(360));
tempPoint[2] = 1;
//console.log("Done working on blob: " + i);
}
}
//console.log("MOVING RIGHT NOW!");
//console.log("______Never lied ever in my life.");
return [tempMoveX, tempMoveY];
}
}
function screenToGameX(x) {
return (x - getWidth() / 2) / getRatio() + getX();
}
function screenToGameY(y) {
return (y - getHeight() / 2) / getRatio() + getY();
}
function drawPoint(x_1, y_1, drawColor, text) {
f.drawPoint(x_1, y_1, drawColor, text);
}
function drawArc(x_1, y_1, x_2, y_2, x_3, y_3, drawColor) {
f.drawArc(x_1, y_1, x_2, y_2, x_3, y_3, drawColor);
}
function drawLine(x_1, y_1, x_2, y_2, drawColor) {
f.drawLine(x_1, y_1, x_2, y_2, drawColor);
}
function drawCircle(x_1, y_1, radius, drawColor) {
f.drawCircle(x_1, y_1, radius, drawColor);
}
function screenDistance() {
var temp = f.getScreenDistance();
return temp;
}
function getDarkBool() {
return f.getDarkBool();
}
function getMassBool() {
return f.getMassBool();
}
function getMemoryCells() {
return f.getMemoryCells();
}
function getCellsArray() {
return f.getCellsArray();
}
function getCells() {
return f.getCells();
}
function getPlayer() {
return f.getPlayer();
}
function getWidth() {
return f.getWidth();
}
function getHeight() {
return f.getHeight();
}
function getRatio() {
return f.getRatio();
}
function getOffsetX() {
return f.getOffsetX();
}
function getOffsetY() {
return f.getOffsetY();
}
function getX() {
return f.getX();
}
function getY() {
return f.getY();
}
function getPointX() {
return f.getPointX();
}
function getPointY() {
return f.getPointY();
}
function getMouseX() {
return f.getMouseX();
}
function getMouseY() {
return f.getMouseY();
}
function getUpdate() {
return f.getLastUpdate();
}
})(window, jQuery);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment