]> git.sesse.net Git - stockfish/blobdiff - src/movegen.cpp
Restore user weights to 100
[stockfish] / src / movegen.cpp
index 297b51ffdeacb7e6d633be647d9e3da3a89ffc49..be8753595f529500b755907f64a3e1e9375f4e22 100644 (file)
@@ -272,12 +272,17 @@ MoveStack* generate<MV_EVASION>(const Position& pos, MoveStack* mlist) {
       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<BISHOP>(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<ROOK>(checksq);
+
       default:
           break;
       }
@@ -304,16 +309,7 @@ MoveStack* generate<MV_EVASION>(const Position& pos, MoveStack* mlist) {
 }
 
 
-/// generate<MV_LEGAL / MV_PSEUDO_LEGAL> computes a complete list of legal
-/// or pseudo-legal moves in the current position.
-template<>
-MoveStack* generate<MV_PSEUDO_LEGAL>(const Position& pos, MoveStack* mlist) {
-
-  assert(pos.is_ok());
-
-  return pos.in_check() ? generate<MV_EVASION>(pos, mlist)
-                        : generate<MV_NON_EVASION>(pos, mlist);
-}
+/// generate<MV_LEGAL> computes a complete list of legal moves in the current position
 
 template<>
 MoveStack* generate<MV_LEGAL>(const Position& pos, MoveStack* mlist) {
@@ -323,7 +319,8 @@ MoveStack* generate<MV_LEGAL>(const Position& pos, MoveStack* mlist) {
   MoveStack *last, *cur = mlist;
   Bitboard pinned = pos.pinned_pieces(pos.side_to_move());
 
-  last = generate<MV_PSEUDO_LEGAL>(pos, mlist);
+  last = pos.in_check() ? generate<MV_EVASION>(pos, mlist)
+                        : generate<MV_NON_EVASION>(pos, mlist);
 
   // Remove illegal moves from the list
   while (cur != last)