Skip to content

Instantly share code, notes, and snippets.

@jaskolek
Forked from vViktorPL/robot.js
Created December 6, 2012 01:32
Show Gist options
  • Save jaskolek/4221160 to your computer and use it in GitHub Desktop.
Save jaskolek/4221160 to your computer and use it in GitHub Desktop.
VOBOT v1.2
var myData = [];
var enemyData = [];
var Robot = function(robot) {
//lol69
};
Robot.prototype.onIdle = function(ev) {
var robot=ev.robot;
if(myData[robot.id] == undefined){
myData[robot.id] = {};
myData[robot.id].followXY=false;
myData[robot.id].followAngle=false;
myData[robot.id].destPos = {x: 0, y:0};
myData[robot.id].destAngle = robot.angle;
myData[robot.id].destCannonAngle = 0;
}
myData[robot.id].bot = robot;
botDo(robot);
myData[robot.id].bot = robot;
}
function distance(p1, p2){
return Math.sqrt(
Math.pow(p1.x-p2.x, 2) +
Math.pow(p1.y-p2.y, 2)
);
}
function startFollowingAngle(bot, angle){
delete myData[bot.id].enemy;
myData[bot.id].destCannonAngle = angle;
myData[bot.id].followAngle = true;
}
function botDo(bot){
if(bot.availableClones > 0)
bot.clone();
if(myData[bot.id].followAngle)
rotateCannonToAngle(bot, myData[bot.id].destCannonAngle);
if(myData[bot.id].enemy == undefined){ //Find closest enemy
var min = 99999;
var dist;
for(var i in enemyData){
dist = distance(enemyData[i].position, bot.position);
if(min>dist){
min=dist;
myData[bot.id].enemy = i;
myData[bot.id].followAngle = false;
}
}
if(myData[bot.id].enemy == undefined){
bot.rotateCannon(5);
}
}else{
rotateCannonToPos(bot, enemyData[myData[bot.id].enemy].position);
}
if(myData[bot.id].followXY){
dist = distance(bot.position, myData[bot.id].destPos);
if(dist>10){
var alpha=angleBetween(bot.position, myData[bot.id].destPos);
followAngle(bot, normalizeAngle(alpha-90));
if(Math.abs(bot.angle-myData[bot.id].destAngle) < 5)
bot.ahead(dist*0.01);
}else{
myData[bot.id].followXY=false;
}
}else{
var newX = random(bot, bot.arenaWidth-40)+20;
var newY = random(bot, bot.arenaHeight-40)+20;
var newPos = {x: newX, y: newY};
if(distance(bot.position, newPos) > 20){
var tooNear = false;
for(var i in enemyData){
if(distance(enemyData[i].position, newPos) < 20){
tooNear = true
break;
}
}
if(tooNear == false)
goToXY(bot, newX, newY);
}
}
}
function rotateCannonToPos(bot, pos){
rotateCannonToAngle(bot, angleBetween(bot.position, pos));
}
function rotateCannonToAngle(robot, ang){
diff = Math.abs(robot.cannonAbsoluteAngle-ang);
//myData[robot.id].destCannonAngle = ang;
if(robot.cannonAbsoluteAngle > ang)
robot.rotateCannon(-diff*0.1);
else
robot.rotateCannon(diff*0.1);
}
function followAngle(bot, angle){
diff = angle - bot.angle;
if(diff>180)
diff -= 180;
myData[bot.id].destAngle = angle;
//if(myData[bot.id].enemy != undefined)
// bot.rotateCannon(diff>0?1:-1);
bot.turn(diff*0.1);
}
function isEnemy(bot, me){
return bot.parentId == null && bot.id!=me.parentId;
}
function predictEnemyPos(){
}
function random(bot, max){
return Math.round((bot.position.x + bot.position.y + bot.angle)%max);
}
function angleBetween(p1, p2){
if(p1 == undefined) return 0;
if(p2 == undefined) return 0;
var x = -p2.x + p1.x;
var y = -p2.y + p1.y;
if(x==0){
if(y<0)
return 90;
else
return 270;
}
alpha = (Math.atan(y/x)/3.1415)*180;
if(x<0) alpha +=180;
return normalizeAngle(alpha);
}
function normalizeAngle(angle){
while(angle<0)
angle+=360;
while(angle>360)
angle-=360;
return angle;
}
function goToXY(bot, X, Y){
myData[bot.id].destPos = {x: X, y: Y};
myData[bot.id].followXY = true;
}
Robot.prototype.onScannedRobot = function(ev) {
var robot=ev.robot;
var scan =ev.scannedRobot;
if(isEnemy(scan, robot)){
enemyData[scan.id] = scan;
safeFire(robot);
}
}
function safeFire(robot){
for(var i in myData){
if(i != robot.id){
var alpha = angleBetween(robot.position, myData[i].bot.position);
if (Math.abs(alpha-robot.cannonAbsoluteAngle) < 15){
return;
}
}
}
robot.fire();
}
Robot.prototype.onHitByBullet = function(ev) {
var robot;
robot = ev.robot;
startFollowingAngle(normalizeAngle(180-ev.bulletBearing));
if(robot.life<5)
delete myData[robot.id];
//robot.turn(90 - ev.bulletBearing);
};
Robot.prototype.onRobotCollision = function(ev) {
var bot = ev.robot;
bot.back(20);
var newX = random(bot, bot.arenaWidth-40)+20;
var newY = random(bot, bot.arenaHeight-40)+20;
goToXY(bot, newX, newY);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment