return b & (b - 1);
}
-
+/// board_size_bb() returns a bitboard representing all the squares
+/// on a board with given size.
+
+inline Bitboard board_size_bb(File f, Rank r) {
+ return BoardSizeBB[f][r];
+}
+
+ inline bool opposite_colors(Square s1, Square s2) {
+
+ return bool(DarkSquares & s1) != bool(DarkSquares & s2);
+ }
/// rank_bb() and file_bb() return a bitboard representing all the squares on
/// the given file or rank.
attackedBy[Us][Pt] |= b;
attackedBy[Us][ALL_PIECES] |= b;
- if (b & kingRing[Them])
+ if (b & kingRing[Them] & ~double_pawn_attacks_bb<Them>(pos.pieces(Them, PAWN)))
{
kingAttackersCount[Us]++;
- kingAttackersWeight[Us] += KingAttackWeights[Pt];
+ kingAttackersWeight[Us] += KingAttackWeights[std::min(int(Pt), QUEEN + 1)];
kingAttacksCount[Us] += popcount(b & attackedBy[Them][KING]);
}
}
constexpr Rank rank_of(Square s) {
- return Rank(s >> 3);
+ return Rank(s / FILE_NB);
}
-constexpr Square relative_square(Color c, Square s) {
- return Square(s ^ (c * 56));
+constexpr Rank relative_rank(Color c, Rank r, Rank maxRank = RANK_8) {
+ return Rank(c == WHITE ? r : maxRank - r);
}
-constexpr Rank relative_rank(Color c, Rank r) {
- return Rank(r ^ (c * 7));
+constexpr Rank relative_rank(Color c, Square s, Rank maxRank = RANK_8) {
+ return relative_rank(c, rank_of(s), maxRank);
}
-constexpr Rank relative_rank(Color c, Square s) {
- return relative_rank(c, rank_of(s));
+constexpr Square relative_square(Color c, Square s, Rank maxRank = RANK_8) {
+ return make_square(file_of(s), relative_rank(c, s, maxRank));
}
- inline bool opposite_colors(Square s1, Square s2) {
- #ifdef LARGEBOARDS
- return int(s1 - (s1 % FILE_NB)) ^ int(s2 - (s2 % FILE_NB));
- #else
- int s = int(s1) ^ int(s2);
- return ((s >> 3) ^ s) & 1;
- #endif
- }
-
constexpr Direction pawn_push(Color c) {
return c == WHITE ? NORTH : SOUTH;
}