// 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 ||
- pawn_rank(strongerSide, kingSq) >= rank)
+ relative_rank(strongerSide, kingSq) >= rank)
return ScaleFactor(0);
}
}
assert(pos.pawn_count(weakerSide) >= 1);
Square kingSq = pos.king_square(weakerSide);
- if(pawn_rank(weakerSide, kingSq) <= RANK_2 &&
- pawn_rank(weakerSide, pos.king_square(strongerSide)) >= RANK_4 &&
+ if(relative_rank(weakerSide, kingSq) <= RANK_2 &&
+ relative_rank(weakerSide, pos.king_square(strongerSide)) >= RANK_4 &&
(pos.rooks(weakerSide) & relative_rank_bb(weakerSide, RANK_3)) &&
(pos.pawns(weakerSide) & relative_rank_bb(weakerSide, RANK_2)) &&
(pos.king_attacks(kingSq) & pos.pawns(weakerSide))) {
pos.pawn_is_passed(strongerSide, wpsq2))
return SCALE_FACTOR_NONE;
- Rank r = Max(pawn_rank(strongerSide, wpsq1), pawn_rank(strongerSide, wpsq2));
+ Rank r = Max(relative_rank(strongerSide, wpsq1), relative_rank(strongerSide, wpsq2));
if(file_distance(bksq, wpsq1) <= 1 && file_distance(bksq, wpsq2) <= 1
- && pawn_rank(strongerSide, bksq) > r) {
+ && relative_rank(strongerSide, bksq) > r) {
switch(r) {
case RANK_2: return ScaleFactor(10);
// Case 1: Defending king blocks the pawn, and cannot be driven away.
if(square_file(weakerKingSq) == square_file(pawnSq)
- && pawn_rank(strongerSide, pawnSq) < pawn_rank(strongerSide, weakerKingSq)
+ && relative_rank(strongerSide, pawnSq) < relative_rank(strongerSide, weakerKingSq)
&& (square_color(weakerKingSq) != square_color(strongerBishopSq)
- || pawn_rank(strongerSide, weakerKingSq) <= RANK_6))
+ || relative_rank(strongerSide, weakerKingSq) <= RANK_6))
return ScaleFactor(0);
// Case 2: Opposite colored bishops.
// These rules are probably not perfect, but in practice they work
// reasonably well.
- if(pawn_rank(strongerSide, pawnSq) <= RANK_5)
+ if(relative_rank(strongerSide, pawnSq) <= RANK_5)
return ScaleFactor(0);
else {
Bitboard ray =
Square weakerKingSq = pos.king_square(weakerSide);
if(square_file(weakerKingSq) == square_file(pawnSq)
- && pawn_rank(strongerSide, pawnSq) < pawn_rank(strongerSide, weakerKingSq)
+ && relative_rank(strongerSide, pawnSq) < relative_rank(strongerSide, weakerKingSq)
&& (square_color(weakerKingSq) != square_color(strongerBishopSq)
- || pawn_rank(strongerSide, weakerKingSq) <= RANK_6))
+ || relative_rank(strongerSide, weakerKingSq) <= RANK_6))
return ScaleFactor(0);
return SCALE_FACTOR_NONE;