package src.estrategias;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import src.Cliente;
import src.Enemigo;
import src.Explorador;
import src.Fortaleza;
import src.Mina;
import src.UnidadBasica;
import src.estadisticas.Estadisticas;
import src.estadisticas.NodoMapaEstadisticas;
import src.pathFinding.Astar;
import com.gameloftProgrammersCup.client.ClientCommand;
import com.gameloftProgrammersCup.client.Vision;
import com.gameloftProgrammersCup.clientInterfaces.MapElement;
import com.gameloftProgrammersCup.clientInterfaces.Point;
public class EstrategiaExplorador extends EstrategiaUnidad{
@Override
public ClientCommand accionDeTurno(UnidadBasica unidad) {
ClientCommand nuevoComando=new ClientCommand();
nuevoComando.setId(unidad.getJugador().getFortaleza().getIdComando());
nuevoComando.setIdUnit(unidad.getId());
int centroX=unidad.getPosition().getX();
int centroY=unidad.getPosition().getY();
int rango=unidad.getVision();
int limiteIzquierdo=(centroX-rango)>=0 ? centroX-rango : 0;
int limiteDerecho=(centroX+rango)<unidad.getJugador().getFortaleza().anchoMapa ? centroX+rango : unidad.getJugador().getFortaleza().anchoMapa-1;
int limiteSuperior=(centroY-rango)>=0 ? centroY-rango : 0;
int limiteInferior=(centroY+rango)<unidad.getJugador().getFortaleza().altoMapa ? centroY+rango : unidad.getJugador().getFortaleza().altoMapa-1;
//primero marco todo en el rango de vision como descubierto
boolean noSirve=true;
for (int i = limiteIzquierdo; i<=limiteDerecho;i++ ){
for (int j=limiteSuperior;j<=limiteInferior;j++){
if (unidad.getPosition().distance(new Point(i,j))<=rango){
if(!unidad.getJugador().getFortaleza().isPointAfuera(new Point(i,j))){
MapElement meCandidato= unidad.getJugador().getFortaleza().mapa[i][j];
if(meCandidato!= null && meCandidato.getClass().getName().equals("src.Enemigo") && ((Enemigo)meCandidato).getUltimoTurnoVisto()==unidad.getJugador().turno){
if (((Enemigo)meCandidato).getType()==Vision.TYPE_ENEMY_COLLECTOR && ((Explorador)unidad).turnosSiguiendoColector<=Explorador.MAXIMO_TURNOS_SIGUIENDO_EXPLORADOR){
noSirve=false;
Point destino=new Point(i,j);
if (unidad.destino==null || !destino.equals(unidad.destino)){
((Explorador)unidad).turnosSiguiendoColector++;
}
else{
Iterator itRecursos=unidad.getJugador().getFortaleza().resources.iterator();
noSirve=true;
while (itRecursos.hasNext()){
Mina mina=(Mina)itRecursos.next();
if (mina.getPosition().distance(destino)<=1){
noSirve=false;
break;
}
}
}
if (noSirve)
continue;
unidad.setPeligrosidad(false);
unidad.setDescubir(true);
unidad.setARangoDeAccion(false);
unidad.setWayPoints(Astar.intentoDePathFinding(destino, unidad, unidad.getJugador().getFortaleza()));
unidad.destino=destino;
nuevoComando.setType("move");
nuevoComando.setDestination((Point)unidad.getWayPoints().get(0));
}
}
}
}
}
}
if (noSirve && (unidad.getWayPoints()==null || unidad.getWayPoints().size()==0 ||((Point)unidad.getWayPoints().get(0)).distance(unidad.getPosition())<unidad.getMovementSpeed() || !Astar.verificarCamino(unidad))){
((Explorador)unidad).turnosSiguiendoColector=0;
//genero lista de puntos no descubiertos, prioriza el lado enemigo si no conozco la fortaleza.
NodoMapaEstadisticas[][] mapaDescubierto = unidad.getJugador().getFortaleza().estadisticas.mapaEstadistico;
List nodosNoDescubiertos=new ArrayList();
limiteIzquierdo=unidad.getJugador().getFortaleza().getId()==1 ? unidad.getJugador().getFortaleza().anchoMapa/2 : 0;
limiteDerecho=unidad.getJugador().getFortaleza().getId()==1 ? unidad.getJugador().getFortaleza().anchoMapa : unidad.getJugador().getFortaleza().anchoMapa/2;
limiteSuperior=0;
limiteInferior=unidad.getJugador().getFortaleza().altoMapa;
for (int i = limiteIzquierdo; i<limiteDerecho;i++ ){
for (int j=limiteSuperior;j<limiteInferior;j++){
if (!Fortaleza.isPointAfuera(new Point(i,j)) && !mapaDescubierto[i][j].isDescubierto())
nodosNoDescubiertos.add(new Point(i,j));
}
}
/*Point destino=unidad.getJugador().getFortaleza().getPosition();
if (nodosNoDescubiertos.size()>0){
int rnd;
rnd = (int)(Math.random()*(nodosNoDescubiertos.size()-1));
destino=(Point) nodosNoDescubiertos.get(rnd);
System.out.println("Puntos no descubiertos : "+nodosNoDescubiertos.size());
}// no va con random se pierde mucho*/
int distancia=0;
Point destino=null;
Iterator it=nodosNoDescubiertos.iterator();
while (it.hasNext()){
Point punto=(Point)it.next();
if ((distancia==0 || (unidad.getPosition().distance(punto)<=distancia))){
//(distancia==0 || (ub.getPosition().distance(new Point(i,j))+ub.getJugador().getFortaleza().getPosition().distance(new Point(i,j))<=distancia))){
if (unidad.getPosition().distance(punto)==distancia){
if (unidad.getJugador().getFortaleza().getPosition().distance(punto)<destino.distance(unidad.getJugador().getFortaleza().getPosition())){
destino=punto;
distancia=destino.distance(unidad.getPosition());
}
}
else
{
destino=punto;
distancia=destino.distance(unidad.getPosition());
}
}
}
unidad.setPeligrosidad(false);
unidad.setDescubir(true);
unidad.setARangoDeAccion(false);
unidad.setWayPoints(Astar.intentoDePathFinding(destino, unidad, unidad.getJugador().getFortaleza()));
unidad.destino=destino;
}
nuevoComando.setType("move");
nuevoComando.setDestination((Point)unidad.getWayPoints().get(0));
nuevoComando.setUnitType(unidad.getType());
unidad.setCommand(nuevoComando);
return nuevoComando;
}
}