Skip to content

Instantly share code, notes, and snippets.

@esova-ana
Created April 3, 2016 21:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save esova-ana/28b4f5b95f37ef5a79578c80bf6bafed to your computer and use it in GitHub Desktop.
Save esova-ana/28b4f5b95f37ef5a79578c80bf6bafed to your computer and use it in GitHub Desktop.
Arena Fight
/*****************************************************************************
Defeat the enemy hero in a duel!
*****************************************************************************/
var SELF = this;
SELF.ATTACK = function (enemy, xE, yE) {
if (SELF.distanceTo(enemy) <= 7) {
SELF.attack(enemy);
} else {
if (isApproaching(enemy)) {
SELF.shield();
} else {
var increment = nextStepTo({x: xE, y: yE});
if (increment) {
SELF.moveXY(SELF.pos.x + increment.x, SELF.pos.y + increment.y);
} else {
SELF.shield();
}
}
}
};
/*****************************************************************************
OBSERVE
*****************************************************************************/
var enemy = SELF.findNearestEnemy();
/*****************************************************************************
PATTERNS
*****************************************************************************/
var oldDistance;
function isExplosion (distance) {
// @TODO: needs more sophesticated logic
// 1. check if enemy is very close
// 2. check if he moves away very fast
if (1 + oldDistance >= distance) {
oldDistance = distance;
return false;
} else {
oldDistance = distance;
return true;
}
}
function isApproaching(enemy) {
var distance = SELF.distanceTo(enemy);
if (oldDistance > distance) {
oldDistance = distance;
return true;
} else {
oldDistance = distance;
return false;
}
}
function nextStepTo (target) {
var xE = target.x;
var yE = target.y;
var dX = (xE - xS);
var dY = (yE - yS);
if (dX !== 0) {
var m = dY / dX; // slope
var d = Math.sqrt(dX*dX + dY*dY);
if (d > 1) {
var addX = dX / d;
var addY = dY / d;
return { x: addX, y: addY };
} else { // target is very close
return null;
}
} else if (dY < -1 ) { // target is south
return { x: 0, y: 1 };
} else if (dY > 1 ) { // target is north
return { x: 0, y: -1 };
} else { // target is very close
return null;
}
}
function go (nextIncrement) {
SELF.moveXY(SELF.pos.x+nextIncrement.x, SELF.pos.y+nextIncrement.y);
}
function walk (next) {
SELF.moveXY(next.x, next.y);
}
function isTrapped(enemy) {
var x = enemy.pos.x;
var y = enemy.pos.y;
var TRAPSFIELD = [{x: 59, y: 24},{x: 62, y: 15}];
var inXrange = (TRAPSFIELD[0].x < x) && (x < TRAPSFIELD[1].x);
var inYrange = (TRAPSFIELD[0].y > y) && (y > TRAPSFIELD[1].y);
if (inXrange && inYrange) {
return true;
} else {
return false;
}
}
/*****************************************************************************
ORIENT
*****************************************************************************/
var MODES = {
OPEN : 1,
ATTACK : 2,
MOVE : 3,
DEFEND : 4
};
var MODE = MODES.OPEN;
/*****************************************************************************
ACTIONS
*****************************************************************************/
// var opening2 = [
// {x: 17, y: 42},{x: 15, y: 47},{x: 14, y: 51},{x: 10, y: 51}
// ];
var step = 0;
var opening = [
{x: 58, y: 13},{x: 64, y: 14},{x: 68, y: 14},
{x: 70, y: 24},
{x: 54, y: 31},{x: 15, y: 44},{x: 10, y: 50}
];
var justgo = false;
var oldStep;
var strategy = [
{x: 15, y: 44},{x: 63, y: 24},{x: 66, y: 19},
{x: 65, y: 12},{x: 9, y: 11}
];
var wait = 0;
var Eold = {};
/*****************************************************************************
DECIDE
*****************************************************************************/
SELF.moveXY(40, 32);
loop {
enemy = SELF.findNearestEnemy();
if (enemy && enemy.type === 'potion-master') {
SELF.attack(enemy);
} else if (enemy) {
var xE = enemy.pos.x;
var yE = enemy.pos.y;
var xS = SELF.pos.x;
var yS = SELF.pos.y;
/*********************************************************************
MODE: OPEN
*********************************************************************/
if (MODE === MODES.OPEN) {
var myX = SELF.pos.x;
var myY = SELF.pos.y;
var next = opening[step];
var dist = SELF.distanceTo(enemy);
var Epos = {x:xE, y:yE};
var isFollowing = Epos.x !== Eold.x && Epos.y != Eold.y || step < 4;
Eold = Epos;
var isFrozen = oldDistance === dist;
if (next) {
if (step === 1) {
if (SELF.distanceTo(enemy) > 8) {
SELF.shield();
} else {
walk(next);
step ++;
}
} else if (isFollowing || isTrapped(enemy)) {
if (oldStep !== step) {
walk(next);
}
oldStep = step;
if (step === 2 && SELF.distanceTo(enemy) < 10) {
step++;
} else if (wait > 20) {
step++;
} else if (step === 2 && !isFrozen) {
SELF.shield();
wait++;
} else {
step++;
}
} else if (isFrozen) {
SELF.attack(enemy);
} else {
SELF.attack(enemy);
}
} else {
oldDistance = SELF.distanceTo(enemy);
step = 0;
MODE = MODES.MOVE; // RE-ORIENT
}
/*********************************************************************
MODE: STRATEGY
*********************************************************************/
} else if (MODE === MODES.MOVE) {
justgo = false;
if (isExplosion(SELF.distanceTo(enemy))) {
for(var k=0; k<strategy.length;) {
if (k===3 && !justgo) {
dist = SELF.distanceTo(enemy);
if (dist < 10) {
justgo = true;
} else if (wait > 60) {
justgo = true;
} else {
SELF.shield();
wait++;
}
} else {
SELF.moveXY(strategy[k].x, strategy[k].y);
k++;
}
}
MODE = MODES.ATTACK; // RE-ORIENT
} else {
SELF.shield();
}
/*********************************************************************
MODE: ATTACK
*********************************************************************/
} else if (MODE === MODES.ATTACK) {
SELF.ATTACK(enemy, xE, yE);
/*********************************************************************
MODE: DEFEND
*********************************************************************/
} else if (MODE === MODES.DEFEND) {
SELF.shield();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment