protected virtual string GetSanForMove(Move move, Piece movingPiece, bool isCapture, CastlingType castle, List <Position> ambiguities)
{
if (castle == CastlingType.KingSide)
{
return("O-O");
}
if (castle == CastlingType.QueenSide)
{
return("O-O-O");
}
bool needsUnambigFile = false;
bool needsUnambigRank = false;
if (ambiguities.Count > 0)
{
foreach (Position amb in ambiguities)
{
if (amb.Rank == move.OriginalPosition.Rank)
{
needsUnambigFile = true;
}
if (amb.File == move.OriginalPosition.File)
{
needsUnambigRank = true;
}
}
if (!needsUnambigFile && !needsUnambigRank)
{
needsUnambigFile = true;
}
}
StringBuilder sanBuilder = new StringBuilder();
if (!(movingPiece is Pawn))
{
sanBuilder.Append(char.ToUpperInvariant(movingPiece.GetFenCharacter()));
}
else if (isCapture)
{
sanBuilder.Append(move.OriginalPosition.File.ToString().ToLowerInvariant());
needsUnambigFile = false;
needsUnambigRank = false;
}
if (needsUnambigFile)
{
sanBuilder.Append(move.OriginalPosition.File.ToString().ToLowerInvariant());
}
if (needsUnambigRank)
{
sanBuilder.Append(move.OriginalPosition.Rank.ToString());
}
if (isCapture)
{
sanBuilder.Append("x");
}
sanBuilder.Append(move.NewPosition.ToString().ToLowerInvariant());
if (move.Promotion.HasValue)
{
sanBuilder.Append("=");
sanBuilder.Append(move.Promotion.Value);
}
if (IsWinner(ChessUtilities.GetOpponentOf(WhoseTurn)))
{
sanBuilder.Append("#");
}
else if (IsInCheck(WhoseTurn))
{
sanBuilder.Append("+");
}
return(sanBuilder.ToString());
}