package rules;
import java.util.List;
import javax.swing.JOptionPane;
import logic.PieceBuilder;
import models.Game;
import models.Piece;
public enum Promote
{
CLASSIC, NO_PROMOTIONS;
public Piece promotePiece(Piece pieceToPromote, boolean pieceCanBePromoted, String pieceTypeToPromoteFrom)
{
if (m_lastPromotedFromPieceName == null)
m_lastPromotedFromPieceName = mResetLastPromoted;
Piece promotedPiece;
switch (this)
{
case CLASSIC:
promotedPiece = classicPromotion(pieceToPromote, pieceTypeToPromoteFrom);
break;
case NO_PROMOTIONS:
promotedPiece = pieceToPromote;
break;
default:
promotedPiece = null;
}
mResetLastPromoted = m_lastPromotedFromPieceName;
return promotedPiece;
}
public Piece undo(Piece pieceToUnpromote)
{
switch (this)
{
case CLASSIC:
return classicUndo(pieceToUnpromote);
case NO_PROMOTIONS:
return pieceToUnpromote;
default:
return null;
}
}
public void setGame(Game game)
{
mGame = game;
}
private Piece classicPromotion(Piece pieceToPromote, String pieceTypeToPromoteFrom)
{
if (pieceToPromote.getPromotesTo() == null || pieceToPromote.getPromotesTo().size() == 0)
{
m_lastPromotedFromPieceName = pieceToPromote.getName();
mPromotedToClass = pieceToPromote.getName();
return pieceToPromote;
}
else if (pieceTypeToPromoteFrom != null && !pieceTypeToPromoteFrom.equals(pieceToPromote.getName()))
{
// we don't want to promote the objective pieces. That makes things
// weird...
if ((pieceToPromote.isBlack() && !mGame.getBlackRules().getObjectiveName().equals(pieceToPromote.getName()))
|| (!pieceToPromote.isBlack() && !mGame.getWhiteRules().getObjectiveName().equals(pieceToPromote.getName())))
{
try
{
Piece promoted = PieceBuilder.makePiece(pieceTypeToPromoteFrom, pieceToPromote.isBlack(),
pieceToPromote.getSquare(), pieceToPromote.getBoard());
if (promoted.isBlack())
mGame.getBlackTeam().set(mGame.getBlackTeam().indexOf(pieceToPromote), promoted);
else
mGame.getWhiteTeam().set(mGame.getWhiteTeam().indexOf(pieceToPromote), promoted);
promoted.getLegalDests().clear();
promoted.setMoveCount(pieceToPromote.getMoveCount());
return promoted;
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
else if (pieceTypeToPromoteFrom == null && mGame.isBlackMove() == pieceToPromote.isBlack())
{
mPromotedToClass = ""; //$NON-NLS-1$
if ((!pieceToPromote.isBlack() && pieceToPromote.getPromotesTo().size() == 1) || pieceToPromote.isBlack()
&& pieceToPromote.getPromotesTo().size() == 1)
mPromotedToClass = pieceToPromote.getPromotesTo().get(0);
while (mPromotedToClass.equals("")) //$NON-NLS-1$
{
List<String> promotion = pieceToPromote.isBlack() ? pieceToPromote.getPromotesTo() : pieceToPromote.getPromotesTo();
String result = (String) JOptionPane.showInputDialog(null,
Messages.getString("selectPromotionType"), Messages.getString("promoChoice"), //$NON-NLS-1$ //$NON-NLS-2$
JOptionPane.PLAIN_MESSAGE, null, promotion.toArray(), null);
if (result == null)
continue;
mPromotedToClass = result;
pieceTypeToPromoteFrom = result;
}
}
else if (pieceTypeToPromoteFrom != null && !pieceToPromote.isBlack() && pieceToPromote.getPromotesTo() != null
&& pieceToPromote.getPromotesTo().contains(pieceTypeToPromoteFrom))
{
mPromotedToClass = pieceTypeToPromoteFrom;
}
else if (pieceTypeToPromoteFrom != null && pieceToPromote.isBlack() && pieceToPromote.getPromotesTo() != null
&& pieceToPromote.getPromotesTo().contains(pieceTypeToPromoteFrom))
{
mPromotedToClass = pieceTypeToPromoteFrom;
}
try
{
Piece promoted = PieceBuilder.makePiece(mPromotedToClass, pieceToPromote.isBlack(), pieceToPromote.getSquare(),
pieceToPromote.getBoard());
if (promoted.isBlack())
mGame.getBlackTeam().set(mGame.getBlackTeam().indexOf(pieceToPromote), promoted);
else
mGame.getWhiteTeam().set(mGame.getWhiteTeam().indexOf(pieceToPromote), promoted);
promoted.getLegalDests().clear();
promoted.setMoveCount(pieceToPromote.getMoveCount());
return promoted;
}
catch (Exception e)
{
e.printStackTrace();
return pieceToPromote;
}
}
private Piece classicUndo(Piece pieceToUnpromote)
{
return classicPromotion(pieceToUnpromote, m_lastPromotedFromPieceName);
}
private static String m_lastPromotedFromPieceName;
private Game mGame;
private String mResetLastPromoted;
private String mPromotedToClass;
}