package cardgamecard;
import cardgameevents.CGChangeValueEvent;
import cardgameevents.CGEvent;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
abstract public class CGBaseCard {
/**
* Типы карт (по уровням)
*/
public enum TypeCard{
tcHERO, //карта героя
tcSOLDIER, //пехоты
tcTOWER, //башни
tcSUPPORT, //маги, лечилки
tcBIG_MONSTER //драконы-катапульты
}
//Индексы в массиве карт, участвующих в бою. Схему см в классе героя
public final static int idxSOLDIER_1 = 0;
public final static int idxSOLDIER_2 = 1;
public final static int idxSOLDIER_3 = 2;
public final static int idxSOLDIER_4 = 3;
public final static int idxSOLDIER_5 = 4;
public final static int idxSOLDIER_6 = 5;
public final static int idxTOWER_1 = 6;
public final static int idxTOWER_2 = 7;
public final static int idxTOWER_3 = 8;
public final static int idxTOWER_4 = 9;
public final static int idxSUPPORT_1 = 10;
public final static int idxSUPPORT_2 = 11;
public final static int idxBIG_MONSTER_1 = 12;
public final static int idxHERO = 13;
private TypeCard mTypeCard;
private boolean mActive = false; //Является ли карта активной (выделенной)
private boolean mReverse = false; //Карта перевернута
private boolean mDead = false; //Карта померла
private boolean mBattle = false; //Карта в бою
private int mLevel = 1; //уровень
private int mHealth; //здоровье
private int mShield; //Единицы урона, которые может поглоить щит
private int mDamage; //урон
public CGBaseCard( TypeCard type ){
mTypeCard = type;
}
/**
* Получить имя карты
*/
abstract public String CardName();
/**
* Нанести карте урон damage
*/
public void Damage( int damage ){
mHealth -= damage;
mDead = mHealth < 0;
}
/**
* Получить размер наносимого картой урона
*/
public int Damage(){
return mDamage;
}
/**
* Установить величину урона
*/
public void setDamage(int damage){
mDamage = damage;
}
/**
* Добавить к урону
*/
public void addDamage(int add_damage){
mDamage += add_damage;
}
/**
* Получить размер урона, окторый может заблокировать щит
*/
public int Shield(){
return mShield;
}
/**
* Установить величину щита
*/
public void setShield(int shield){
mShield = shield;
}
/**
* Добавить к величине щита
*/
public void addShield(int add_shield){
mShield += add_shield;
}
/**
* Умерла ли карта
*/
public boolean isDead(){
return mDead;
}
/**
* Сделать карту активной
*/
public void setActive( boolean active ){
mActive = active;
}
/**
* Активна ли карта
*/
public boolean isActive(){
return mActive;
}
/**
* Карта участвует в бою
*/
public boolean isBattle(){
return mBattle;
}
/**
* Отправить карту в бой/вытащить из боя
*/
public void setBattle( boolean battle ){
mBattle = battle;
}
/**
* Евляется ли это псевдо-картой (равносильно пустому месту)
*/
public boolean isEmptyCard(){
return false;
}
/**
* Обработка событий
* @param event - событие, которое необходимо обработать
*/
public void handleEvent( CGEvent event ){
int type = event.Type();
if( type == CGEvent.evGET_DAMAGE ){
CGChangeValueEvent ev = (CGChangeValueEvent) event.Event();
Damage( ev.Value() );
}
else if( type == CGEvent.evADD_DAMAGE ){
CGChangeValueEvent ev = (CGChangeValueEvent) event.Event();
addDamage( ev.Value() );
}
else if( type == CGEvent.evADD_SHIELD ){
CGChangeValueEvent ev = (CGChangeValueEvent) event.Event();
addShield( ev.Value() );
}
}
/**
* Возвращает позиции, на которых может стоять эта карта
*/
public List<Integer> getPossiblePosition(){
if(mTypeCard == TypeCard.tcSOLDIER)
return new ArrayList<Integer>( Arrays.asList(idxSOLDIER_1, idxSOLDIER_2, idxSOLDIER_3,
idxSOLDIER_4, idxSOLDIER_5, idxSOLDIER_6) );
else if(mTypeCard == TypeCard.tcTOWER)
return new ArrayList<Integer>( Arrays.asList(idxTOWER_1, idxTOWER_2, idxTOWER_3, idxTOWER_4) );
else if(mTypeCard == TypeCard.tcSUPPORT)
return new ArrayList<Integer>( Arrays.asList(idxSUPPORT_1, idxSUPPORT_2) );
else if(mTypeCard == TypeCard.tcBIG_MONSTER)
return new ArrayList<Integer>( Arrays.asList(idxBIG_MONSTER_1) );
else return new ArrayList<Integer>( Arrays.asList(idxHERO) );
}
}