ulong Board::GetSafeKingMoves(int color) { ulong safeMoves = 0; int kingSquare = GetKingSquare(color); ulong moves = MoveGenerator::kingAttacks[kingSquare]; ulong newMoves = moves & (~colorBitBoards[color]); moves = newMoves; if(moves != 0) { RemovePiece(kingSquare, Pieces::GetPiece(PieceTypes::King, color)); while(moves != 0) { int move = PopLowestSetBit(moves); if(!IsSquareAttacked(move, OtherColor(color))) { safeMoves |= BitBoard(move); } } AddPiece(kingSquare, Pieces::GetPiece(PieceTypes::King, color)); } return safeMoves; }
bool Board::IsKingInCheck(int color) const { return IsSquareAttacked(GetKingSquare(color), OtherColor(color)); }
void MoveGenerator::GenerateAllPawnMoves(Board *gameboard, MOVELIST *move_list) { side = gameboard->side_to_move; /* WHITE PAWN MOVES */ if (side == WHITE) { for (piece_number = 0; piece_number < gameboard->piece_number[WHITE_PAWN]; ++piece_number) { square = gameboard->piece_list[WHITE_PAWN][piece_number]; if (gameboard->pieces[square+10] == EMPTY) { AddWhitePawnMove(gameboard, square, square+10, move_list); if (rank_of[square] == RANK_2 && gameboard->pieces[square+20] == EMPTY) { AddQuietMove(gameboard, MOVE(square, (square+20), EMPTY, EMPTY, MOVEFLAGPAWNSTART), move_list); } } if(!SQUAREOFFBOARD(square + 9) && PieceColor[gameboard->pieces[square + 9]] == BLACK) { AddWhitePawnCapture(gameboard, square, square+9, gameboard->pieces[square + 9], move_list); } if(!SQUAREOFFBOARD(square + 11) && PieceColor[gameboard->pieces[square + 11]] == BLACK) { AddWhitePawnCapture(gameboard, square, square+11, gameboard->pieces[square + 11], move_list); } if(gameboard->en_passant_square != NO_SQUARE) { if(square + 9 == gameboard->en_passant_square) { AddEnPassantMove(gameboard, MOVE(square,square + 9,EMPTY,EMPTY,MOVEFLAGENPASSANT), move_list); } if(square + 11 == gameboard->en_passant_square) { AddEnPassantMove(gameboard, MOVE(square,square + 11,EMPTY,EMPTY,MOVEFLAGENPASSANT), move_list); } } } /* WHITE SIDE CASTLING */ if(gameboard->castle_permission & WHITE_KING_CASTLE) { if(gameboard->pieces[F1] == EMPTY && gameboard->pieces[G1] == EMPTY) { if(!IsSquareAttacked(E1,BLACK,gameboard) && !IsSquareAttacked(F1,BLACK,gameboard) ) { AddQuietMove(gameboard, MOVE(E1, G1, EMPTY, EMPTY, MOVEFLAGCASTLE), move_list); } } } if(gameboard->castle_permission & WHITE_QUEEN_CASTLE) { if(gameboard->pieces[D1] == EMPTY && gameboard->pieces[C1] == EMPTY && gameboard->pieces[B1] == EMPTY) { if(!IsSquareAttacked(E1,BLACK,gameboard) && !IsSquareAttacked(D1,BLACK,gameboard) ) { AddQuietMove(gameboard, MOVE(E1, C1, EMPTY, EMPTY, MOVEFLAGCASTLE), move_list); } } } } /* BLACK PAWN MOVES */ else { for(piece_number = 0; piece_number < gameboard->piece_number[BLACK_PAWN]; ++piece_number) { square = gameboard->piece_list[BLACK_PAWN][piece_number]; if(gameboard->pieces[square - 10] == EMPTY) { AddBlackPawnMove(gameboard, square, square-10, move_list); if(rank_of[square] == RANK_7 && gameboard->pieces[square - 20] == EMPTY) { AddQuietMove(gameboard, MOVE(square,(square-20),EMPTY,EMPTY,MOVEFLAGPAWNSTART),move_list); } } if(!SQUAREOFFBOARD(square - 9) && PieceColor[gameboard->pieces[square - 9]] == WHITE) { AddBlackPawnCapture(gameboard, square, square-9, gameboard->pieces[square - 9], move_list); } if(!SQUAREOFFBOARD(square - 11) && PieceColor[gameboard->pieces[square - 11]] == WHITE) { AddBlackPawnCapture(gameboard, square, square-11, gameboard->pieces[square - 11], move_list); } if(gameboard->en_passant_square != NO_SQUARE) { if(square - 9 == gameboard->en_passant_square) { AddEnPassantMove(gameboard, MOVE(square,square - 9,EMPTY,EMPTY,MOVEFLAGENPASSANT), move_list); } if(square - 11 == gameboard->en_passant_square) { AddEnPassantMove(gameboard, MOVE(square,square - 11,EMPTY,EMPTY,MOVEFLAGENPASSANT), move_list); } } } /* BLACK SIDE CASTLING */ if(gameboard->castle_permission & BLACK_KING_CASTLE) { if(gameboard->pieces[F8] == EMPTY && gameboard->pieces[G1] == EMPTY) { if(!IsSquareAttacked(E8,WHITE,gameboard) && !IsSquareAttacked(F8,WHITE,gameboard) ) { AddQuietMove(gameboard, MOVE(E8, G8, EMPTY, EMPTY, MOVEFLAGCASTLE), move_list); } } } if(gameboard->castle_permission & BLACK_QUEEN_CASTLE) { if(gameboard->pieces[D8] == EMPTY && gameboard->pieces[C1] == EMPTY && gameboard->pieces[B1] == EMPTY) { if(!IsSquareAttacked(E8,WHITE,gameboard) && !IsSquareAttacked(D8,WHITE,gameboard) ) { AddQuietMove(gameboard, MOVE(E8, C8, EMPTY, EMPTY, MOVEFLAGCASTLE), move_list); } } } } }