package src;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import com.gameloftProgrammersCup.client.UnitStats;
import com.gameloftProgrammersCup.clientInterfaces.MapElement;
import com.gameloftProgrammersCup.clientInterfaces.BasicPJ;
import com.gameloftProgrammersCup.clientInterfaces.Command;
import com.gameloftProgrammersCup.clientInterfaces.Point;
import src.estadisticas.NodoMapaEstadisticas;
import src.estrategias.*;
import src.*;
import com.gameloftProgrammersCup.client.ClientCommand;
import src.estadisticas.*;
import src.pathFinding.Astar;
public abstract class Atacante extends UnidadBasica {
public EstrategiaUnidad estrategia;
//public Point objetivo;//puede tomar diferentes significados, para el guardian es el destino
public Atacante(int actionRange, int actionSpeed, int life,int movementSpeed, int id, Cliente jugador, int vision,EstrategiaUnidad estrategia) {
super(actionRange, actionSpeed, life, movementSpeed, id, jugador, vision);
this.estrategia=estrategia;
// TODO Auto-generated constructor stub
}
public Command getCurrentCommand() {
// TODO Auto-generated method stub
return null;
}
public int getMaxLoad() {
// TODO Auto-generated method stub
return 0;
}
public void resourceXML(Document arg0, Element arg1) {
// TODO Auto-generated method stub
}
public void setResources(int arg0) {
// TODO Auto-generated method stub
}
public void unitXML(Document arg0, Element arg1) {
// TODO Auto-generated method stub
}
public void visionXML(Document arg0, Element arg1) {
// TODO Auto-generated method stub
}
public int resourcesStored() {
// TODO Auto-generated method stub
return 0;
}
public int getType(){
return MapElement.TYPE_ATTACKER;
}
@Override
public void actualizarStat(UnitStats stat, Fortaleza fortaleza) {
super.actualizarStat(stat,fortaleza);
fortaleza.addResources(stat.getResources());
this.setLife(stat.getLife());
this.setPosition(stat.getPosition());
if (stat.getErrorCode()!=0)
System.out.println(" Error "+ (new Integer(stat.getErrorCode())).toString());
if (this.getCommand()!=null && this.getPosition().equals(this.getCommand().getDestination())){
//por algun motivo no devuelve el destinationReached, calculo si llego
// System.out.println("Error code a sustituir:"+stat.getErrorCode());
stat.setCommandErrorCode(Command.ERRORCODE_DESTINATIONREACHED);
if (this.getWayPoints()!=null && this.getWayPoints().size()>0)
this.getWayPoints().remove(0);
}
switch(stat.getErrorCode()){
case 0://si colectaba busco la mina y cuento lo que saque
// collect en la mina
/*if (this.getCommand()!=null && ((ClientCommand)this.getCommand()).getCommandType()=="collect" && !this.getCommand().getDestination().equals(fortaleza.getPosition())){
Set recursos=fortaleza.getKnownResources();
Iterator it=recursos.iterator();
while (it.hasNext()){
Mina recurso=(Mina)it.next();
if (recurso.getPosition().equals(this.getCommand().getDestination())){
recurso.setResourcesStored(recurso.resourcesStored()+this.getActionSpeed());
this.setResources(stat.getPayload());
if (this.resourcesStored()==this.getMaxLoad())
this.setCommand(null);
System.out.println("Cantidad de recursos en la mina "+ recurso.resourcesStored()+ " " +stat.getPayload());
break;
}
}
}
else
{
//collect en la fortaleza
if (this.getCommand()!=null && ((ClientCommand)this.getCommand()).getCommandType()=="collect" && this.getCommand().getDestination().equals(fortaleza.getPosition())){
this.setResources(stat.getPayload());
if (this.resourcesStored()==0)
this.setCommand(null);
}
}*/
break;
case Command.ERRORCODE_CHARFULL:
{
Set recursos=fortaleza.getKnownResources();
Iterator it=recursos.iterator();
while (it.hasNext()){
Mina recurso=(Mina)it.next();
if (recurso.getPosition().equals(this.getCommand().getDestination())){
recurso.setResourcesStored(recurso.resourcesStored()+stat.getPayload()-this.resourcesStored());
this.setResources(stat.getPayload());
System.out.println("Cantidad de recursos en la mina "+ recurso.resourcesStored()+ " " +stat.getPayload());
break;
}
}
this.setCommand(null);
break;
}
case Command.ERRORCODE_DESTINATIONREACHED:
this.setCommand(null);
break;
case Command.ERRORCODE_CELLAVAILABLE:
//buscar otro camino
/* if (this.wayPoints!=null && this.wayPoints.size() ==1 ){
this.setCommand(null);
this.wayPoints.clear();
}*/
if (this.destino==null && this.wayPoints!=null && this.wayPoints.size()>1){
System.out.println("Jodido");
}
if (this.wayPoints!=null && this.wayPoints.size()>0){
Point wayPoint=(Point)this.wayPoints.get(0);
int centroX=this.getPosition().getX();
int centroY=this.getPosition().getY();
int desplazamientoX=wayPoint.getX()-centroX;
int desplazamientoY=wayPoint.getY()-centroY;
int cantidadDiagonalesExactas=Math.min(Math.abs(desplazamientoX), Math.abs(desplazamientoY));
int diagonalX=desplazamientoX>0 ? 1: -1;
int diagonalY=desplazamientoY>0 ? 1: -1;
desplazamientoX=Math.abs(desplazamientoX-cantidadDiagonalesExactas*diagonalX);
desplazamientoY=Math.abs(desplazamientoY-cantidadDiagonalesExactas*diagonalY);
Mina obstaculo;
while (desplazamientoX>0){//es uno u el otro
obstaculo=new Mina();
obstaculo.setPosition(new Point(centroX+desplazamientoX*diagonalX,centroY));
obstaculos.add(obstaculo);
desplazamientoX--;
}
while (desplazamientoY>0){//es uno u el otro
obstaculo=new Mina();
obstaculo.setPosition(new Point(centroX,centroY+desplazamientoY*diagonalY));
obstaculos.add(obstaculo);
desplazamientoY--;
}
while (cantidadDiagonalesExactas>0){
obstaculo=new Mina();
obstaculo.setPosition(new Point(wayPoint.getX()-diagonalX*cantidadDiagonalesExactas,wayPoint.getY()-diagonalY*cantidadDiagonalesExactas));
cantidadDiagonalesExactas--;
obstaculos.add(obstaculo);
}
this.setCommand(null);
this.wayPoints.clear();
}
break;
case Command.ERRORCODE_RESOURCEMAXEDOUT:
Set recursos=fortaleza.getKnownResources();
Iterator it=recursos.iterator();
Mina recurso=new Mina();
while (it.hasNext()){
recurso=(Mina)it.next();
if (recurso.getPosition().equals(this.getCommand().getDestination()))
break;
}
recurso.setResourcesStored(recurso.resourcesStored()+stat.getPayload()-this.resourcesStored());
this.setResources(stat.getPayload());
// System.out.println("Cantidad de recursos en la mina "+ recurso.resourcesStored());
if (fortaleza.resourcesPayload<recurso.resourcesStored())
fortaleza.resourcesPayload=recurso.resourcesStored();
else
recurso.setResourcesStored(fortaleza.resourcesPayload);
recurso.setMaxedOut(true);
this.setCommand(null);
break;
case Command.ERRORCODE_NOTHINGTODEPOSIT://no deberiamos llegar a esto, perdemos turnos
this.setResources(0);
System.out.println("No deberia estar aca!!!!");
this.setCommand(null);
break;
}
}
/**
* @return the estrategia
*/
public EstrategiaUnidad getEstrategia() {
return estrategia;
}
/**
* @param estrategia the estrategia to set
*/
public void setEstrategia(EstrategiaUnidad estrategia) {
this.command=null;
/*??? if (this.wayPoints!=null && this.wayPoints.size()>0)
this.wayPoints.clear();*/
this.estrategia = estrategia;
}
/**
* Devuelve el primer enemigo que este en rango de visi�n
* @return un enemigo, el primero encontrado. Sino NULL
* NOTA: puede ser �til hacer una funci�n como �sta que devuelva el primero en rango de tiro
*/
public Enemigo enemigoEnRango( ){
//no es �ptimo pero anda (deber�a andar)
for(int y=position.getY()-vision;y<=position.getY()+vision;y++)
{
for(int x= position.getX()-vision;x<=position.getX()+vision;x++)
{
Point pEvaluado = new Point(x,y);
if(!jugador.getFortaleza().isPointAfuera(pEvaluado)&& pEvaluado.distance(position)<=vision)
{
MapElement meEvaluado = jugador.getFortaleza().getElementoMapaEnPosicion(pEvaluado);
if (meEvaluado != null && meEvaluado.getClass().getName().equals("src.Enemigo") && ((Enemigo)meEvaluado).getUltimoTurnoVisto()==this.getJugador().turno )
return (Enemigo)meEvaluado;
}
}
}
return null;
}
/**
* genera comando para atacar en el punto par�metro.
* por ahora el punto es un lugar que est� en rango... no s� si se usar� para perseguir
* @return
*/
public ClientCommand atacar(Point p){
ClientCommand nuevoComando = new ClientCommand();
getJugador().incIdComando();//incremento el id
nuevoComando.setId( getJugador().getIdComando());
nuevoComando.setIdUnit(getId());
nuevoComando.setType("attack");
nuevoComando.setOwner(this);
nuevoComando.setDestination(p);
nuevoComando.setUnitType(getType());
Estadisticas.addEstadisticaAtaque(jugador.turno, position.getX(), position.getY(), this.actionSpeed/position.distance(p));
return nuevoComando;
}
public ClientCommand idle(){
ClientCommand cIdle = new ClientCommand();
getJugador().incIdComando();//incremento el id
cIdle.setId( getJugador().getIdComando());
cIdle.setIdUnit(getId());
cIdle.setType("idle");
cIdle.setOwner(this);
cIdle.setDestination(position);
cIdle.setUnitType(this.getType());
return cIdle;
}
/**
* realiza la acci�n del turno
* @return
*/
public ClientCommand actuar(){
//if(estrategia != null)
return estrategia.accionDeTurno(this);
}
/**
* crea un comando idle
* @return
*/
/*public ClientCommand idle(){
}*/
public int getTipoInternoUnidad(){
return -1;//por ahora no estamos pensando en crear atacantes x... no tiene atributos, por empezar
}
/**
* @override
*/
public void setEstrategiaUnidad(EstrategiaUnidad eu){
this.setEstrategia(eu);
}
}