package src.estrategias;
import java.util.Iterator;
import java.util.Set;
import src.Atacante;
import src.Enemigo;
import src.Fortaleza;
import src.Mina;
import src.UnidadBasica;
import src.pathFinding.Astar;
import com.gameloftProgrammersCup.client.ClientCommand;
import com.gameloftProgrammersCup.clientInterfaces.Point;
import com.gameloftProgrammersCup.client.Vision;
public class EstrategiaAsesinoColector extends EstrategiaUnidad{
/**
* pseudo-casteo, llamo a la otra que usa un Atacante
*/
public ClientCommand accionDeTurno(UnidadBasica ub) {
return accionDeTurno((Atacante )ub);
}
public ClientCommand accionDeTurno(Atacante asesino){
if (asesino.enemigoEnRango()!=null){
//ATTACK!
Enemigo enemigo = asesino.enemigoEnRango();
if (enemigo.getPosition().distance(asesino.getPosition())>asesino.getActionRange()){//tengo que acercarme
Point destino=enemigo.getPosition();
ClientCommand nuevoComando=new ClientCommand();
nuevoComando.setId(asesino.getJugador().getIdComando());
nuevoComando.setIdUnit(asesino.getId());
asesino.setPeligrosidad(false);
asesino.setDescubir(false);
asesino.setARangoDeAccion(true);
asesino.setWayPoints(Astar.intentoDePathFinding(destino, asesino, asesino.getJugador().getFortaleza()));
asesino.destino=destino;
nuevoComando.setType("move");
nuevoComando.setDestination((Point)asesino.getWayPoints().get(0));
asesino.destino=(Point)asesino.getWayPoints().get(0);
nuevoComando.setUnitType(asesino.getType());
asesino.setCommand(nuevoComando);
return nuevoComando;
}//sino ataco
ClientCommand cAtaque =asesino.atacar(enemigo.getPosition());
asesino.setCommand(cAtaque);
return cAtaque;
}
else
{//move
Point destino=null;
ClientCommand nuevoComando=new ClientCommand();
nuevoComando.setId(asesino.getJugador().getIdComando());
nuevoComando.setIdUnit(asesino.getId());
if (asesino.destino==null || asesino.getWayPoints()==null || asesino.getWayPoints().size()==0 || !Astar.verificarCamino(asesino)){
//if (asesino.resourcesStored()<asesino.getMaxLoad()){//recolecto
//calculo mina
Set recursos=asesino.getJugador().getFortaleza().getKnownResources();
Iterator it2= recursos.iterator();
int distancia=99999;
Mina minaCercana=new Mina();
while (it2.hasNext()){
Mina recurso=(Mina)it2.next();
if (!recurso.isMaxedOut()
&& asesino.getJugador().getFortaleza().fortalezaEnemiga!=null
&& recurso.getPosition().distance(asesino.getJugador().getFortaleza().fortalezaEnemiga.getPosition())<distancia){
int centroX=recurso.getPosition().getX();
int centroY=recurso.getPosition().getY();
int rango=1;
int limiteIzquierdo=(centroX-rango)>=0 ? centroX-rango : 0;
int limiteDerecho=(centroX+rango)<asesino.getJugador().getFortaleza().anchoMapa ? centroX+rango : asesino.getJugador().getFortaleza().anchoMapa-1;
int limiteSuperior=(centroY-rango)>=0 ? centroY-rango : 0;
int limiteInferior=(centroY+rango)<asesino.getJugador().getFortaleza().altoMapa ? centroY+rango : asesino.getJugador().getFortaleza().altoMapa-1;
for (int i = limiteIzquierdo; i<=limiteDerecho;i++ ){
for (int j=limiteSuperior;j<=limiteInferior;j++){
if (!Fortaleza.isPointAfuera(new Point(i,j)) && asesino.getJugador().getFortaleza().mapa[i][j]!=null
&& asesino.getJugador().getFortaleza().mapa[i][j].getClass().getName().equals("src.Enemigo")//la unica forma de comparacion con el el getClass src.Enemigo
&& asesino.getJugador().getFortaleza().mapa[i][j].getType()==Vision.TYPE_ENEMY_COLLECTOR //siendo enemigo si me sirve el tipo
&& (((Enemigo)(asesino.getJugador().getFortaleza().mapa[i][j])).getUltimoTurnoVisto())>asesino.getJugador().turno-20){
destino = new Point (i,j);
minaCercana.setPosition(recurso.getPosition());
distancia=minaCercana.getPosition().distance(asesino.getJugador().getFortaleza().fortalezaEnemiga.getPosition());
}
}
}
}
}
if (minaCercana.getPosition()!=null){
asesino.setPeligrosidad(false);
asesino.setDescubir(false);
asesino.setARangoDeAccion(false);
for (int i=Fortaleza.fortalezaEnemiga.getPosition().getX()-EstrategiaExploradorAcecharColector.perimetro;i<=Fortaleza.fortalezaEnemiga.getPosition().getX()+EstrategiaExploradorAcecharColector.perimetro;i++){
for (int j=Fortaleza.fortalezaEnemiga.getPosition().getY()-EstrategiaExploradorAcecharColector.perimetro;j<=Fortaleza.fortalezaEnemiga.getPosition().getY()+EstrategiaExploradorAcecharColector.perimetro;j++){
if (!Fortaleza.isPointAfuera(new Point(i,j))){
Mina obstaculo=new Mina();
obstaculo.setPosition(new Point(i,j));
asesino.obstaculos.add(obstaculo);
}
}
}
asesino.setWayPoints(Astar.intentoDePathFinding(destino, asesino, asesino.getJugador().getFortaleza()));
asesino.destino=destino;
}
else
return null;
}
nuevoComando.setType("move");
nuevoComando.setDestination((Point)asesino.getWayPoints().get(0));
// destino=asesino.destino;
nuevoComando.setUnitType(asesino.getType());
/* if (destino==null)
return null;*/
asesino.setCommand(nuevoComando);
return nuevoComando;
}
}
}