mirror of
https://github.com/sockspls/badfish
synced 2025-07-11 11:39:15 +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:
parent
a96cba0ec8
commit
1f97b48a31
2 changed files with 30 additions and 9 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue