]> git.sesse.net Git - stockfish/blobdiff - src/position.cpp
Avoid an usless check in pl_move_is_legal
[stockfish] / src / position.cpp
index 2ede62feecd8d7b201baaa9044bf3c59d5241f1a..4184e494c924d198156d1e1b06415d5442f970ff 100644 (file)
@@ -460,7 +460,9 @@ void Position::find_checkers() {
 
 bool Position::pl_move_is_legal(Move m) const {
 
-  return pl_move_is_legal(m, pinned_pieces(side_to_move()));
+  // If we're in check, all pseudo-legal moves are legal, because our
+  // check evasion generator only generates true legal moves.
+  return is_check() || pl_move_is_legal(m, pinned_pieces(side_to_move()));
 }
 
 bool Position::pl_move_is_legal(Move m, Bitboard pinned) const {
@@ -468,11 +470,7 @@ bool Position::pl_move_is_legal(Move m, Bitboard pinned) const {
   assert(is_ok());
   assert(move_is_ok(m));
   assert(pinned == pinned_pieces(side_to_move()));
-
-  // If we're in check, all pseudo-legal moves are legal, because our
-  // check evasion generator only generates true legal moves.
-  if (is_check())
-      return true;
+  assert(!is_check());
 
   // Castling moves are checked for legality during move generation.
   if (move_is_castle(m))
@@ -599,19 +597,17 @@ bool Position::move_is_check(Move m, Bitboard dcCandidates) const {
 
   case BISHOP:
     return   (dcCandidates && bit_is_set(dcCandidates, from))
-          || (   direction_between_squares(ksq, to) != DIR_NONE
-              && bit_is_set(piece_attacks<BISHOP>(ksq), to));
+          || (direction_is_diagonal(ksq, to) && bit_is_set(piece_attacks<BISHOP>(ksq), to));
 
   case ROOK:
     return   (dcCandidates && bit_is_set(dcCandidates, from))
-          || (   direction_between_squares(ksq, to) != DIR_NONE
-              && bit_is_set(piece_attacks<ROOK>(ksq), to));
+          || (direction_is_straight(ksq, to) && bit_is_set(piece_attacks<ROOK>(ksq), to));
 
   case QUEEN:
       // Discovered checks are impossible!
       assert(!bit_is_set(dcCandidates, from));
-      return (   direction_between_squares(ksq, to) != DIR_NONE
-              && bit_is_set(piece_attacks<QUEEN>(ksq), to));
+      return (   (direction_is_straight(ksq, to) && bit_is_set(piece_attacks<ROOK>(ksq), to))
+              || (direction_is_diagonal(ksq, to) && bit_is_set(piece_attacks<BISHOP>(ksq), to)));
 
   case KING:
       // Discovered check?
@@ -1941,26 +1937,26 @@ bool Position::has_mate_threat(Color c) {
 
 void Position::init_zobrist() {
 
-  for(Piece p = WP; p <= BK; p++)
-      for(Square s = SQ_A1; s <= SQ_H8; s++)
-          zobrist[color_of_piece(p)][type_of_piece(p)][s] = genrand_int64();
+  for (int i = 0; i < 2; i++)
+      for (int j = 0; j < 8; j++)
+          for (int k = 0; k < 64; k++)
+              zobrist[i][j][k] = Key(genrand_int64());
 
-  zobEp[0] = 0ULL;
-  for(int i = 1; i < 64; i++)
-      zobEp[i] = genrand_int64();
+  for (int i = 0; i < 64; i++)
+      zobEp[i] = Key(genrand_int64());
 
-  for(int i = 15; i >= 0; i--)
-      zobCastle[(i&8) | (i&1) | ((i&2) << 1) | ((i&4) >> 1)] = genrand_int64();
+  for (int i = 0; i < 16; i++)
+      zobCastle[i] = genrand_int64();
 
   zobSideToMove = genrand_int64();
 
   for (int i = 0; i < 2; i++)
       for (int j = 0; j < 8; j++)
           for (int k = 0; k < 16; k++)
-              zobMaterial[i][j][k] = (k > 0)? genrand_int64() : 0LL;
+              zobMaterial[i][j][k] = (k > 0)? Key(genrand_int64()) : Key(0LL);
 
   for (int i = 0; i < 16; i++)
-      zobMaterial[0][KING][i] = zobMaterial[1][KING][i] = 0ULL;
+      zobMaterial[0][KING][i] = zobMaterial[1][KING][i] = Key(0ULL);
 }