/// <summary> /// The move piece to fen position. /// </summary> /// <param name="charToken"> /// The char token. /// </param> /// <param name="intFile"> /// The int file. /// </param> /// <param name="intRank"> /// The int rank. /// </param> /// <param name="blnAnyLocation"> /// The bln any location. /// </param> /// <param name="blnAllowPromotion"> /// The bln allow promotion. /// </param> private static void MovePieceToFenPosition( ref char charToken, int intFile, int intRank, bool blnAnyLocation, bool blnAllowPromotion) { Piece.PieceNames piecename = Piece.PieceNames.King; Player player = charToken.ToString() == charToken.ToString().ToUpper() ? Game.PlayerWhite : Game.PlayerBlack; switch (charToken.ToString().ToUpper()) { case "K": piecename = Piece.PieceNames.King; break; case "Q": piecename = Piece.PieceNames.Queen; break; case "R": piecename = Piece.PieceNames.Rook; break; case "B": piecename = Piece.PieceNames.Bishop; break; case "N": piecename = Piece.PieceNames.Knight; break; case "P": piecename = Piece.PieceNames.Pawn; break; } // Try to find the required piece in from the available pool of captured // pieces that haven't been placed on the board yet. Piece pieceToUse = null; foreach (Piece pieceCaptured in player.OpposingPlayer.CapturedEnemyPieces) { if ((pieceCaptured.Name == piecename || (blnAllowPromotion && pieceCaptured.Name == Piece.PieceNames.Pawn)) && (pieceCaptured.StartLocation == Board.GetSquare(intFile, intRank) || blnAnyLocation)) { pieceToUse = pieceCaptured; break; } } if (pieceToUse != null) { Square square = Board.GetSquare(intFile, intRank); pieceToUse.Uncapture(0); square.Piece = pieceToUse; pieceToUse.Square = square; pieceToUse.NoOfMoves = blnAnyLocation ? 1 : 0; if (pieceToUse.Name != piecename) { pieceToUse.Promote(piecename); } // Mark the token in the original FEN string with a * to indicate that the piece has been processed charToken = '.'; } }