package src.estrategias;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import com.gameloftProgrammersCup.clientInterfaces.Point;
import com.gameloftProgrammersCup.clientInterfaces.Command.*;
import com.gameloftProgrammersCup.client.*;
import com.gameloftProgrammersCup.command.AttackCommand;
import src.*;
import src.pathFinding.Astar;
public class EstrategiaGuardiaPerimetreando extends EstrategiaUnidad{
public List waypoints=new ArrayList();
public int orden=-1;
//tiene que ser un atacante para implementar esta estrategia, por eso lo casteo
public ClientCommand accionDeTurno(UnidadBasica ub)
{return accionDeTurno((Guardia )ub);}
public ClientCommand accionDeTurno(Guardia guardian){
//primero chequear si hay enemigo en rango por favor
if( guardian.enemigoEnRango() != null)
//ATTACK!
{
Enemigo enemigo = guardian.enemigoEnRango();
ClientCommand cAtaque =guardian.atacar(enemigo.getPosition());
//comandos.add(nuevoComando);
guardian.setCommand(cAtaque);
return cAtaque;
}
else{//idle
return pasearPorPerimetro(guardian,Fortaleza.instanciaFortaleza.getRadioSeguridad(),Fortaleza.instanciaFortaleza.getRadioSeguridad(),Fortaleza.instanciaFortaleza.getPosition());
}
//falta ver si tiene objetivo o si patrulla o idlea
//return null;//unreachable!!
}
public ClientCommand pasearPorPerimetro(UnidadBasica unidad,int perimetroX,int perimetroY,Point centro){//perimetro de 4 puntos
int perimetroExteriorX=perimetroX;
int perimetroExteriorY=perimetroY;
//int perimetroInterior=9;
boolean afuera=true;
Point destino=null;
if (waypoints.size()==0){
int centroX=centro.getX();
int centroY=centro.getY();
// Arma los punto. El -5 es porque no tiene sentido que pase tan cerca del borde, le da un margen
int limiteIzquierdo=(centroX-perimetroExteriorX)>=0 ? centroX-perimetroExteriorX : 0;
int limiteDerecho=(centroX+perimetroExteriorX)<unidad.getJugador().getFortaleza().anchoMapa-5 ? centroX+perimetroExteriorX : unidad.getJugador().getFortaleza().anchoMapa-1;
int limiteSuperior=(centroY-perimetroExteriorY)>=0 ? centroY-perimetroExteriorY : 0;
int limiteInferior=(centroY+perimetroExteriorY)<unidad.getJugador().getFortaleza().altoMapa-5 ? centroY+perimetroExteriorY : unidad.getJugador().getFortaleza().altoMapa-1;
Point waypoint1=new Point (limiteDerecho,limiteSuperior);
Point waypoint2=new Point (limiteDerecho,limiteInferior);
Point waypoint3=new Point (limiteIzquierdo,limiteInferior);
Point waypoint4=new Point (limiteIzquierdo,limiteSuperior);
//Chequeo para ver si algun way queda afuera, si es una esquina me quedan solo 3 ways
if (Math.abs(waypoint1.getX()-centroX)==perimetroExteriorX || Math.abs(waypoint1.getY()-centroY)==perimetroExteriorY)
waypoints.add(waypoint1);
if (Math.abs(waypoint2.getX()-centroX)==perimetroExteriorX || Math.abs(waypoint2.getY()-centroY)==perimetroExteriorY)
waypoints.add(waypoint2);
if (Math.abs(waypoint3.getX()-centroX)==perimetroExteriorX || Math.abs(waypoint3.getY()-centroY)==perimetroExteriorY)
waypoints.add(waypoint3);
if (Math.abs(waypoint4.getX()-centroX)==perimetroExteriorX || Math.abs(waypoint4.getY()-centroY)==perimetroExteriorY)
waypoints.add(waypoint4);
//armo la secuencia de los ways
if (waypoints.size()==3){
//el 0 es el del medio
if ((((Point)waypoints.get(0)).getX() == ((Point)waypoints.get(1)).getX() && ((Point)waypoints.get(0)).getY() == ((Point)waypoints.get(2)).getY())
|| (((Point)waypoints.get(0)).getX() == ((Point)waypoints.get(2)).getX() && ((Point)waypoints.get(0)).getY() == ((Point)waypoints.get(1)).getY())){
Point punto=(Point)waypoints.remove(0);
waypoints.add(1,punto);
waypoints.add(punto);
}
//el 1 es el del medio
if ((((Point)waypoints.get(1)).getX() == ((Point)waypoints.get(2)).getX() && ((Point)waypoints.get(1)).getY() == ((Point)waypoints.get(0)).getY())
|| (((Point)waypoints.get(1)).getX() == ((Point)waypoints.get(0)).getX() && ((Point)waypoints.get(1)).getY() == ((Point)waypoints.get(2)).getY())){
Point punto=(Point)waypoints.remove(1);
waypoints.add(1,punto);
waypoints.add(punto);
}
//el 2 es el del medio
if ((((Point)waypoints.get(2)).getX() == ((Point)waypoints.get(0)).getX() && ((Point)waypoints.get(2)).getY() == ((Point)waypoints.get(1)).getY())
|| (((Point)waypoints.get(2)).getX() == ((Point)waypoints.get(1)).getX() && ((Point)waypoints.get(2)).getY() == ((Point)waypoints.get(0)).getY())){
Point punto=(Point)waypoints.remove(2);
waypoints.add(1,punto);
waypoints.add(punto);
}
}
else{
//armo la secuencia de los ways
if (limiteIzquierdo!=centroX-perimetroExteriorX){
//orden de los way
//123214
waypoints.add(3,waypoints.get(0));
waypoints.add(3,waypoints.get(1));
}
if (limiteDerecho!=centroX+perimetroExteriorX){
//143234
waypoints.add(1,waypoints.get(waypoints.size()-2));
waypoints.add(1,waypoints.get(waypoints.size()-1));
}
if (limiteSuperior!=centroY-perimetroExteriorY){
//123432
waypoints.add(waypoints.get(2));
waypoints.add(waypoints.get(1));
}
if (limiteInferior!=centroY+perimetroExteriorY){
//121434
waypoints.add(2,waypoints.get(waypoints.size()-1));
waypoints.add(2,waypoints.get(0));
}
}
Iterator it=waypoints.iterator();
while (it.hasNext()){
Point punto=(Point)it.next();
if (destino==null || punto.distance(unidad.getPosition())<destino.distance(unidad.getPosition())){
destino=punto;
}
}
unidad.destino=destino;
}
if (unidad.getWayPoints()==null || unidad.getWayPoints().size()==0 || !Astar.verificarCamino(unidad)){
Iterator it=waypoints.iterator();
while (it.hasNext()){
Point punto=(Point)it.next();
if (destino==null || punto.distance(unidad.getPosition())<destino.distance(unidad.getPosition())){
destino=punto;
}
}
if (orden<0 && destino.distance(unidad.getPosition())<3){
orden=waypoints.indexOf(destino);
}
unidad.destino=destino;
if (orden>=0){
if (destino.distance(unidad.getPosition())<3){
orden++;
orden=orden%waypoints.size();
destino=(Point)waypoints.get(orden);
unidad.destino=destino;
}
destino=(Point)waypoints.get(orden);
unidad.destino=destino;
}
unidad.setPeligrosidad(false);
unidad.setDescubir(false);
unidad.setWayPoints(Astar.intentoDePathFinding(unidad.destino, unidad, unidad.getJugador().getFortaleza()));
unidad.destino=unidad.destino;
}
ClientCommand nuevoComando=new ClientCommand();
nuevoComando.setId(unidad.getJugador().getIdComando());
nuevoComando.setIdUnit(unidad.getId());
nuevoComando.setType("move");
nuevoComando.setDestination((Point)unidad.getWayPoints().get(0));
nuevoComando.setUnitType(unidad.getType());
unidad.setCommand(nuevoComando);
return nuevoComando;
}
}