1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-07-11 19:49:14 +00:00

Split calculation of pinners from dc candidates

This let us to calculate only pinners when we now that
dc candidates are not possible.

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
This commit is contained in:
Marco Costalba 2009-02-28 10:20:57 +01:00
parent a96cba0ec8
commit 1f97b48a31
2 changed files with 30 additions and 9 deletions

View file

@ -451,20 +451,24 @@ void Position::find_checkers() {
/// computes bitboards relative to that color only, the other computes both
/// colors. Bitboard checkersBB must be already updated.
void Position::find_hidden_checks(Color us) {
void Position::find_hidden_checks(Color us, unsigned int types) {
Bitboard p1, p2;
Color them = opposite_color(us);
Square ksq = king_square(them);
st->pinned[them] = hidden_checks<ROOK, true>(them, ksq, p1) | hidden_checks<BISHOP, true>(them, ksq, p2);
st->pinners[them] = p1 | p2;
st->dcCandidates[us] = hidden_checks<ROOK, false>(us, ksq, p1) | hidden_checks<BISHOP, false>(us, ksq, p2);
if (types & Pinned)
{
st->pinned[them] = hidden_checks<ROOK, true>(them, ksq, p1) | hidden_checks<BISHOP, true>(them, ksq, p2);
st->pinners[them] = p1 | p2;
}
if (types & DcCandidates)
st->dcCandidates[us] = hidden_checks<ROOK, false>(us, ksq, p1) | hidden_checks<BISHOP, false>(us, ksq, p2);
}
void Position::find_hidden_checks() {
for (Color c = WHITE; c <= BLACK; c++)
find_hidden_checks(c);
find_hidden_checks(c, Pinned | DcCandidates);
}
@ -702,13 +706,13 @@ void Position::update_hidden_checks(Square from, Square to) {
// otherwise skip because our dcCandidates and opponent pinned pieces are not changed.
if ( (moveSquares & RookPseudoAttacks[ksq]) && (checkerMoved || (rooks_and_queens(us) & RookPseudoAttacks[ksq]))
|| (moveSquares & BishopPseudoAttacks[ksq]) && (checkerMoved || (bishops_and_queens(us) & BishopPseudoAttacks[ksq])))
find_hidden_checks(us);
find_hidden_checks(us, Pinned | DcCandidates);
ksq = king_square(us);
if (ksq == to)
{
find_hidden_checks(them);
find_hidden_checks(them, Pinned | DcCandidates);
return;
}
@ -720,7 +724,18 @@ void Position::update_hidden_checks(Square from, Square to) {
// dcCandidates and our pinned pieces are not changed.
if ( (moveSquares & RookPseudoAttacks[ksq]) && (checkerCaptured || (rooks_and_queens(them) & RookPseudoAttacks[ksq]))
|| (moveSquares & BishopPseudoAttacks[ksq]) && (checkerCaptured || (bishops_and_queens(them) & BishopPseudoAttacks[ksq])))
find_hidden_checks(them);
{
// If we don't have opponent dc candidates and we are moving in the
// attack line then won't be dc candidates also after the move.
if ( st->dcCandidates[them]
|| bit_is_set(RookPseudoAttacks[ksq], from)
|| bit_is_set(BishopPseudoAttacks[ksq], from))
find_hidden_checks(them, Pinned | DcCandidates);
else
find_hidden_checks(them, Pinned);
}
}

View file

@ -288,6 +288,12 @@ public:
static void init_piece_square_tables();
private:
enum {
Pinned = 1,
DcCandidates = 2
};
// Initialization helper functions (used while setting up a position)
void clear();
void put_piece(Piece p, Square s);
@ -303,7 +309,7 @@ private:
void undo_promotion_move(Move m);
void undo_ep_move(Move m);
void find_checkers();
void find_hidden_checks(Color us);
void find_hidden_checks(Color us, unsigned int types);
void find_hidden_checks();
void update_hidden_checks(Square from, Square to);