public MoveGenerator(AttacksService attacksService, ISlideMoveGenerator slideMoveGenerator, PinDetector pinDetector, MoveValidator validator)
 {
     _attacksService     = attacksService;
     _slideMoveGenerator = slideMoveGenerator;
     _pinDetector        = pinDetector;
     _validator          = validator;
 }
        public Board DoMoveIfKingSafe(Board board, Move move)
        {
            var afterMoveBitBoards     = board.DoMove(move);
            var enemyAttackedAfterMove = AttacksService.GetAllAttacked(afterMoveBitBoards);
            var myKings = board.WhiteToMove ? afterMoveBitBoards.BitBoard[ChessPiece.WhiteKing] : afterMoveBitBoards.BitBoard[ChessPiece.BlackKing];
            var isSafe  = (enemyAttackedAfterMove & myKings) == 0;

            return(isSafe ? afterMoveBitBoards : null);
        }
        public IList <Move> GetPotentialCastlingMoves(Board board)
        {
            var   castlingMoves = new List <Move>();
            var   isWhite       = board.WhiteToMove;
            int   kingPos;
            ulong queenSideCastleMask;
            ulong kingSideCastleMask;
            ulong queenSideCastleAttackMask;
            ulong kingSideCastleAttackMask;
            int   piece;
            bool  castlingPermissionQueenSide;
            bool  castlingPermissionKingSide;

            if (isWhite)
            {
                castlingPermissionQueenSide = board.CastlingPermissions[CastlePermission.WhiteQueenSide];
                castlingPermissionKingSide  = board.CastlingPermissions[CastlePermission.WhiteKingSide];
                kingPos                   = board.BitBoard[ChessPiece.WhiteKing].BitScanForward();
                queenSideCastleMask       = Board.WhiteQueenSideCastleMask;
                kingSideCastleMask        = Board.WhiteKingSideCastleMask;
                queenSideCastleAttackMask = Board.WhiteQueenSideCastleAttackMask;
                kingSideCastleAttackMask  = Board.WhiteKingSideCastleAttackMask;
                piece = ChessPiece.WhiteKing;
            }
            else
            {
                castlingPermissionQueenSide = board.CastlingPermissions[CastlePermission.BlackQueenSide];
                castlingPermissionKingSide  = board.CastlingPermissions[CastlePermission.BlackKingSide];
                kingPos                   = board.BitBoard[ChessPiece.BlackKing].BitScanForward();
                queenSideCastleMask       = Board.BlackQueenSideCastleMask;
                kingSideCastleMask        = Board.BlackKingSideCastleMask;
                queenSideCastleAttackMask = Board.BlackQueenSideCastleAttackMask;
                kingSideCastleAttackMask  = Board.BlackKingSideCastleAttackMask;
                piece = ChessPiece.BlackKing;
            }

            var canMaybeCastleQueenSide = castlingPermissionQueenSide && ((board.AllPieces & queenSideCastleMask) == 0);
            var canMaybeCastleKingSide  = castlingPermissionKingSide && (board.AllPieces & kingSideCastleMask) == 0;

            if (canMaybeCastleQueenSide | canMaybeCastleKingSide)
            {
                var attackedByEnemy = AttacksService.GetAllAttacked(board, !board.WhiteToMove);
                if (canMaybeCastleQueenSide && ((attackedByEnemy & queenSideCastleAttackMask) == 0))
                {
                    castlingMoves.Add(new Move(kingPos, kingPos - 2, piece));
                }
                if (canMaybeCastleKingSide && ((attackedByEnemy & kingSideCastleAttackMask) == 0))
                {
                    castlingMoves.Add(new Move(kingPos, kingPos + 2, piece));
                }
            }

            return(castlingMoves);
        }
 public PossibleMovesService(AttacksService attacksService, HyperbolaQuintessence hyperbolaQuintessence)
 {
     AttacksService        = attacksService;
     HyperbolaQuintessence = hyperbolaQuintessence;
     MultiThreadKingSafety = false;
 }