package src;
import com.gameloftProgrammersCup.client.ClientCommand;
import com.gameloftProgrammersCup.client.UnitStats;
import com.gameloftProgrammersCup.clientInterfaces.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import src.estadisticas.*;
import src.*;
import src.estrategias.*;
import src.pathFinding.*;
public abstract class UnidadBasica /*extends ElementoMapa*/ implements BasicPJ,MapElement{
/**
* abarca todas las unidades de un equipo: base y m�viles
*/
/*public static final int TIPO_COLECTOR=0;
public static final int TIPO_FORTALEZA=1;
public static final int TIPO_ATACANTE=2;
public static final int TIPO_DEFENSOR=3;
public static final int TIPO_EXPLORADOR=4;*/
protected int actionRange;//hasta donde puede hacer su acci�n
protected int actionSpeed;//velocidad para realizar su acci�n, creo
protected int life;//puntos de vida
protected int movementSpeed; //velocidad, agregado por pup
protected Stack attacks;//stack con da�os ocasionados por ataques
protected Command command=null;
protected int id;//identificacion unica
protected Cliente jugador;
protected int vision;//rango de visi�n de la unidad
protected int tipoUnidad;//nuestro tipo privado de unidad
protected int ultimoTurnoActualizado =0;//voy a tener que usar esto para ver si alguien muri�
protected List <Point> wayPoints=null;
public Point destino=null;
public boolean peligrosidad=false;
public boolean descubir=false;
public boolean aRangoDeAccion=false;
public List obstaculos=new ArrayList();
public boolean favorecerDiagonalesImperfectas=false;
//nuestros tipos de unidad:
static public final int TIPO_COLECTORINICIAL = 0;
static public final int TIPO_EXPLORADOR = 1;
static public final int TIPO_GUARDIA = 2;
static public final int TIPO_ASESINO = 3;
static public final int TIPO_COLECTORNORMAL = 4;
static public final int MAX_UNIDAD = TIPO_COLECTORNORMAL+1;
//ya estoy haciendo cosas raras... otra vez
public static Class [] clasesTiposUnidad = {ColectorInicial.class,Explorador.class,Guardia.class,Asesino.class,ColectorNormal.class};
protected Point position;
/**
* creator
*/
public UnidadBasica(int actionRange,int actionSpeed ,int life, int movementSpeed, int id, Cliente jugador, int vision){
this.actionRange = actionRange;
this.actionSpeed = actionSpeed;
this.movementSpeed = movementSpeed;
this.life = life;
this.id = id;
this.jugador = jugador;
this.vision = vision;
attacks = new Stack();
}
/**
* Devuelve un stack de ints con todos los ataques recibidos por la unidad
* @author fernando
* @version 0.1
* @return stack con un int por cada ataque recibido que representa el da�o causado. el stack puede ser null
* @see com.gameloftProgrammersCup.clientInterfaces.BasicPJ#getAttacked()
*/
public Stack getAttacked(){
return attacks;
}
/**
* Devuelve el id del jugador due�o de la unidad
* @return int que representa el id del jugador
* @author fernando
* @version 0.1
* @see com.gameloftProgrammersCup.clientInterfaces.BasicPJ#getPlayerCharacterId()
*/
public int getPlayerCharacterId(){
return jugador.getId();
}
/**
* @return the actionRange
*/
public int getActionRange() {
return actionRange;
}
/**
* @param actionRange the actionRange to set
*/
public void setActionRange(int actionRange) {
this.actionRange = actionRange;
}
/**
* @return the actionSpeed
*/
public int getActionSpeed() {
return actionSpeed;
}
/**
* @param actionSpeed the actionSpeed to set
*/
public void setActionSpeed(int actionSpeed) {
this.actionSpeed = actionSpeed;
}
/**
* @return the command
*/
public Command getCommand() {
return command;
}
/**
* @param command the command to set
*/
public void setCommand(Command command) {
this.command = command;
}
/**
* @return the id
*/
public int getId() {
return id;
}
/**
* @param id the id to set
*/
public void setId(int id) {
this.id = id;
}
/**
* @return the life
*/
public int getLife() {
return life;
}
/**
* @param life the life to set
*/
public void setLife(int life) {
if (life < this.life)//recibi da�o
Estadisticas.addEstadisticaAtaque(jugador.turno,position.getX(),position.getY(),this.life-life);
this.life = life;
}
/**
* @return the vision
*/
public int getVision() {
return vision;
}
/**
* @param vision the vision to set
*/
public void setVision(int vision) {
this.vision = vision;
}
/**
* actualiza la unidad con el da�o ocasionado, actualizando puntos de vida y cola de da�os
*
* @see com.gameloftProgrammersCup.clientInterfaces.BasicPJ#hurtUpdate()
*/
public void hurtUpdate(){
}
/*public int getType() {
return 0;
}*/
public void setType(int tipoUnidad) {
// this.tipoUnidad = tipoUnidad;
}
public int getMovementSpeed()
{
return movementSpeed;
}
public void setMovementSpeed(int movementSpeed)
{
this.movementSpeed = movementSpeed;
}
public Point getPosition() {
try{
if(position.getX()<0)
throw new Exception("coordenada x negativa en elemento");
if(position.getY()<0)
throw new Exception("coordenada y negativa en elemento");
return new Point(position.getX(),position.getY());
}catch(Exception e){System.out.println("error devolviendo ubicacion: "+e);e.printStackTrace();return null;}
}
public void setPosition(Point p){
try{
if(p.getX()<0)
throw new Exception("coordenada x negativa en posicion nueva");
if(p.getY()<0)
throw new Exception("coordenada y negativa en posicion nueva");
position = p;
}catch(Exception e){System.out.println("error seteando ubicacion"+e);e.printStackTrace();}
}
public void actualizarStat(UnitStats stat,Fortaleza fortaleza){
//si lleg�, null
Fortaleza.instanciaFortaleza.mapa[stat.getPosition().getX()][stat.getPosition().getY()]=this;
obstaculos.clear();
if (destino!= null)
if (destino.equals(stat.getPosition()) && stat.getErrorCode()==0 && stat.getCommandType()==4)//si no tira error y si se mueve
destino=null;
}
/**
* @return the jugador
*/
public Cliente getJugador() {
return jugador;
}
/**
* acci�n principal del turno
* NOTA: es para usar en las unidades, no est� pensada necesariamente para la fortaleza
* @return
*/
public abstract ClientCommand actuar();
/**
* @return the ultimoTurnoActualizado
*/
public int getUltimoTurnoActualizado() {
return ultimoTurnoActualizado;
}
/**
* @param ultimoTurnoActualizado the ultimoTurnoActualizado to set
*/
public void setUltimoTurnoActualizado(int ultimoTurnoActualizado) {
this.ultimoTurnoActualizado = ultimoTurnoActualizado;
}
public List getWayPoints() {
return wayPoints;
}
public void setWayPoints(List wayPoints) {
this.wayPoints = wayPoints;
}
/**
* devuelve tipo asesino, guardia, etc
* es abstracta, devuelve 0 porque java no me quiere dejar que algo sea est�tico, p�blico y abstracto
* @return
*/
abstract public int getTipoInternoUnidad();
public boolean isDescubir() {
return descubir;
}
public void setDescubir(boolean descubir) {
this.descubir = descubir;
}
public boolean isPeligrosidad() {
return peligrosidad;
}
public void setPeligrosidad(boolean peligrosidad) {
this.peligrosidad = peligrosidad;
}
/**
* para estadisticas
* @param iCantidad: cantidad de casilleros descubiertos
*/
public abstract void addPosicionesDescubiertas(int iCantidad);
/**
* para estadisticas de tipo unidad
* suma una muerte :(
*
*/
public abstract void addMuerteDeEsteTipoDeUnidad();
//abstract static EstadisticasTipoUnidad getEstadisticasTipoUnidad();
/**
* setter de estrategia para unidades, Fortaleza no le va a dar bola
*
*/
public abstract void setEstrategiaUnidad(EstrategiaUnidad eu);
/**
* @return the destino
*/
public Point getDestino() {
return destino;
}
/**
* @param destino the destino to set
*/
public void setDestino(Point destino) {
if (destino != null) //puede darse el caso que se quiera nulear. A m� me est� pasando : /
this.wayPoints = Astar.intentoDePathFinding(destino, this, Fortaleza.instanciaFortaleza);
this.destino = destino;
}
/**
* determina para d�nde mover y devuelve un comando con esa movida
* @param destino: destino final
* @return comando
*/
public ClientCommand moverA(UnidadBasica ub, Point destino){
ClientCommand nuevoComando = new ClientCommand();
Point pMovida = new Point(ub.getPosition().getX(),ub.getPosition().getY());//por las dudas que algo falle
ub.getJugador().incIdComando();
nuevoComando.setId(ub.getJugador().getIdComando());
nuevoComando.setIdUnit(ub.getId());
if (ub.getWayPoints()==null || ub.getWayPoints().size()==0 || !Astar.verificarCamino(ub)){
ub.setWayPoints(Astar.intentoDePathFinding(destino, ub, ub.getJugador().getFortaleza()));
}
pMovida = (Point) ub.getWayPoints().get(0);
nuevoComando.setType("move");
nuevoComando.setDestination(pMovida);
//asesino.destino=(Point)asesino.getWayPoints().get(0);
// destino=asesino.destino;
nuevoComando.setUnitType(ub.getType());
/* if (destino==null)
return null;*/
ub.setCommand(nuevoComando);
return nuevoComando;
}
public boolean isARangoDeAccion() {
return aRangoDeAccion;
}
public void setARangoDeAccion(boolean rangoDeAccion) {
aRangoDeAccion = rangoDeAccion;
}
/**PARA REDEFINIR!!!!!
* @return the estadisticasTipoUnidad
*/
static public EstadisticasTipoUnidad getEstadisticasTipoUnidad() {
return null;
}
/**PARA REDEFINIR!!!!!
* @param estadisticasTipoUnidad the estadisticasTipoUnidad to set
*/
static public void setEstadisticasTipoUnidad(){};
//EstadisticasTipoUnidad estadisticasTipoUnidad) {
//estadisticasTipoUnidad = estadisticasTipoUnidad;
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;
}
public boolean isFavorecerDiagonalesImperfectas() {
return favorecerDiagonalesImperfectas;
}
public void setFavorecerDiagonalesImperfectas(
boolean favorecerDiagonalesImperfectas) {
this.favorecerDiagonalesImperfectas = favorecerDiagonalesImperfectas;
}
}