Square kingSq = pos.king_square(weakSide);
if ( opposite_colors(queeningSq, bishopSq)
- && abs(file_of(kingSq) - pawnFile) <= 1)
- {
- // The bishop has the wrong color, and the defending king is on the
- // file of the pawn(s) or the adjacent file. Find the rank of the
- // frontmost pawn.
- Square pawnSq = frontmost_sq(strongSide, pawns);
-
- // If the defending king has distance 1 to the promotion square or
- // is placed somewhere in front of the pawn, it's a draw.
- if ( square_distance(kingSq, queeningSq) <= 1
- || relative_rank(weakSide, kingSq) <= relative_rank(weakSide, pawnSq))
- return SCALE_FACTOR_DRAW;
- }
+ && square_distance(queeningSq, kingSq) <= 1)
+ return SCALE_FACTOR_DRAW;
}
// All pawns on same B or G file? Then potential draw
if ( relative_rank(weakSide, kingSq) <= RANK_2
&& relative_rank(weakSide, pos.king_square(strongSide)) >= RANK_4
- && (pos.pieces(weakSide, ROOK) & rank_bb(relative_rank(weakSide, RANK_3)))
- && (pos.pieces(weakSide, PAWN) & rank_bb(relative_rank(weakSide, RANK_2)))
- && (pos.attacks_from<KING>(kingSq) & pos.pieces(weakSide, PAWN))
- && (pos.attacks_from<PAWN>(rsq, strongSide) & pos.pieces(weakSide, PAWN)))
+ && relative_rank(weakSide, rsq) == RANK_3
+ && ( pos.pieces(weakSide, PAWN)
+ & pos.attacks_from<KING>(kingSq)
+ & pos.attacks_from<PAWN>(rsq, strongSide)))
return SCALE_FACTOR_DRAW;
return SCALE_FACTOR_NONE;