package minechess.common;
import java.util.ArrayList;
import java.util.List;
import minechess.common.network.NetworkHandler;
import minechess.common.network.PacketOpenPromotionGUI;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.monster.EntityZombie;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.world.World;
/**
* MineChess
* @author MineMaarten
* www.minemaarten.com
* @license Lesser GNU Public License v3 (http://www.gnu.org/licenses/lgpl.html)
*/
public class EntityPawn extends EntityBaseChessPiece{
public EntityPawn(World par1World){
super(par1World);
setSize(0.4F, 0.93F);
}
@Override
public Entity getMob(){
return new EntityZombie(worldObj);
}
@Override
public List<int[]> getPossibleMoves(){
List<int[]> moves = new ArrayList<int[]>();
int[] move1 = new int[2];
move1[0] = targetX;
move1[1] = targetZ + (isBlack() ? -1 : 1); // we don't have to check boundaries, as pawns are immeadiatly transformed into queens on the max Z.
if(firstMove) {
int[] move2 = new int[2];
move2[0] = targetX;
move2[1] = targetZ + (isBlack() ? -2 : 2);
if(!isEnemyAt(move2[0], move2[1])) moves.add(move2);
}
if(!isEnemyAt(move1[0], move1[1])) moves.add(move1);
// capturing rules
if(isEnemyAt(targetX + 1, targetZ + (isBlack() ? -1 : 1))) {
int[] move3 = new int[2];
move3[0] = targetX + 1;
move3[1] = targetZ + (isBlack() ? -1 : 1);
moves.add(move3);
}
if(isEnemyAt(targetX - 1, targetZ + (isBlack() ? -1 : 1))) {
int[] move4 = new int[2];
move4[0] = targetX - 1;
move4[1] = targetZ + (isBlack() ? -1 : 1);
moves.add(move4);
}
return moves;
}
// returns true if there is an enemy at the given x,z. It also returns true
// if there can be enPassanted.
private boolean isEnemyAt(int x, int z){
List<EntityBaseChessPiece> pieces = getChessPieces(true);
for(int i = 0; i < pieces.size(); i++) {
if(pieces.get(i).getTargetPosition()[0] == x && (pieces.get(i).getTargetPosition()[1] == z || pieces.get(i).enPassantPossibility && pieces.get(i).targetZ == targetZ) && pieces.get(i).isBlack() ^ isBlack()) {
return true;
}
}
return false;
}
public void promote(EntityPlayer player, String promotedPieceName){
if(isPromoting() && !worldObj.isRemote && !isDead) {
//Promote the pawn
EntityBaseChessPiece promotedPiece = (EntityBaseChessPiece)EntityList.createEntityByName(promotedPieceName, worldObj);
promotedPiece.setPosition(posX, posY, posZ);
promotedPiece.xOffset = xOffset;
promotedPiece.zOffset = zOffset;
promotedPiece.setTargetPosition(targetX, targetZ);
promotedPiece.setIsBlack(isBlack());
worldObj.spawnEntityInWorld(promotedPiece);
setDead();
for(int i = 0; i < 40; i++) {
MineChessUtils.spawnParticle(EnumParticleTypes.EXPLOSION_NORMAL, worldObj, posX, posY + rand.nextDouble() * 1.5D, posZ, rand.nextDouble() / 10 - 0.05D, rand.nextDouble() / 10 - 0.05D, rand.nextDouble() / 10 - 0.05D);
}
handleAfterTurn(player);
}
}
@Override
public boolean interact(EntityPlayer player){
if(!player.worldObj.isRemote && isPromoting() && player.getCurrentEquippedItem() != null && player.getCurrentEquippedItem().getItem() == MineChess.itemPieceMover && (player.inventory.getCurrentItem().getItemDamage() == 0 && isBlack() || player.inventory.getCurrentItem().getItemDamage() == 1 && !isBlack())) {
NetworkHandler.sendTo(new PacketOpenPromotionGUI(this), (EntityPlayerMP)player);
} else {
super.interact(player);
}
return false;
}
private boolean isPromoting(){
return targetZ % 7 == 0;
}
@Override
protected void handleAfterTurn(EntityPlayer player){
super.handleAfterTurn(player);
if(computerPiece && isPawnAwaitingPromotion()) {//When AI promotes, let it always promote to a Queen.
promote(player, "MineChess.Queen");
}
}
}