Created
April 3, 2016 21:20
-
-
Save esova-ana/28b4f5b95f37ef5a79578c80bf6bafed to your computer and use it in GitHub Desktop.
Arena Fight
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/***************************************************************************** | |
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