GameStatus CalculateStatus(Player playerToValidate, bool validateHasAnyValidMoves)
{
if (_drawn)
{
return(new GameStatus(GameEvent.Draw, Player.None, _drawReason));
}
if (_resigned != Player.None)
{
return(new GameStatus(GameEvent.Resign, _resigned, _resigned + " resigned"));
}
var other = ChessUtilities.GetOpponentOf(playerToValidate);
if (IsInCheck(playerToValidate))
{
if (validateHasAnyValidMoves && !HasAnyValidMoves(playerToValidate))
{
return(new GameStatus(GameEvent.Checkmate, other, playerToValidate + " is checkmated"));
}
return(new GameStatus(GameEvent.Check, other, playerToValidate + " is in check"));
}
if (validateHasAnyValidMoves && !HasAnyValidMoves(playerToValidate))
{
return(new GameStatus(GameEvent.Stalemate, other, "Stalemate"));
}
return(new GameStatus(GameEvent.None, Player.None, "No special event"));
}