X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmovegen.cpp;h=d821f0fad2e0ce56ccf6e03e6d22850b02ddb0b5;hb=ae2f5f25cd8a6bc2762eefc032436052c0db679e;hp=e1e6a54b72aa718c55c9c51bc38416f0d13a4e25;hpb=4c3a000211bea046dd9506bae748576ecf6368fa;p=stockfish diff --git a/src/movegen.cpp b/src/movegen.cpp index e1e6a54b..d821f0fa 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -217,7 +217,7 @@ MoveStack* generate(const Position& pos, MoveStack* mlist) while (b) { from = pop_1st_bit(&b); - switch (pos.type_of_piece_on(from)) + switch (piece_type(pos.piece_on(from))) { case PAWN: /* Will be generated togheter with pawns direct checks */ break; case KNIGHT: mlist = generate_discovered_checks(pos, mlist, from); break; @@ -265,19 +265,24 @@ MoveStack* generate(const Position& pos, MoveStack* mlist) { checkersCnt++; checksq = pop_1st_bit(&b); - assert(pos.color_of_piece_on(checksq) == opposite_color(us)); + assert(piece_color(pos.piece_on(checksq)) == opposite_color(us)); - switch (pos.type_of_piece_on(checksq)) + switch (piece_type(pos.piece_on(checksq))) { case BISHOP: sliderAttacks |= BishopPseudoAttacks[checksq]; break; case ROOK: sliderAttacks |= RookPseudoAttacks[checksq]; break; case QUEEN: - // In case of a queen remove also squares attacked in the other direction to - // avoid possible illegal moves when queen and king are on adjacent squares. - if (RookPseudoAttacks[checksq] & (1ULL << ksq)) - sliderAttacks |= RookPseudoAttacks[checksq] | pos.attacks_from(checksq); + // If queen and king are far we can safely remove all the squares attacked + // in the other direction becuase are not reachable by the king anyway. + if (squares_between(ksq, checksq) || (RookPseudoAttacks[checksq] & (1ULL << ksq))) + sliderAttacks |= QueenPseudoAttacks[checksq]; + + // Otherwise, if king and queen are adjacent and on a diagonal line, we need to + // use real rook attacks to check if king is safe to move in the other direction. + // For example: king in B2, queen in A1 a knight in B1, and we can safely move to C1. else sliderAttacks |= BishopPseudoAttacks[checksq] | pos.attacks_from(checksq); + default: break; }