]> git.sesse.net Git - stockfish/blobdiff - src/book.cpp
Templetize make_move() helpers
[stockfish] / src / book.cpp
index fbb1984cf5cba6ca183465f7b58b5d4bbeaedb0a..8624dfbf8e88d9c386e970b2096ae13045df821d 100644 (file)
@@ -306,11 +306,6 @@ namespace {
   const Key* ZobEnPassant = PolyGlotRandoms + 772;
   const Key* ZobTurn      = PolyGlotRandoms + 780;
 
-  // PieceOffset is calculated as 64 * (PolyPiece ^ 1) where PolyPiece
-  // is: BP = 0, WP = 1, BN = 2, WN = 3 ... BK = 10, WK = 11
-  const int PieceOffset[] = { 0, 64, 192, 320, 448, 576, 704, 0,
-                              0,  0, 128, 256, 384, 512, 640 };
-
   // book_key() returns the PolyGlot hash key of the given position
   uint64_t book_key(const Position& pos) {
 
@@ -319,8 +314,12 @@ namespace {
 
     while (b)
     {
+        // Piece offset is at 64 * polyPiece where polyPiece is defined as:
+        // BP = 0, WP = 1, BN = 2, WN = 3, ... BK = 10, WK = 11
         Square s = pop_1st_bit(&b);
-        key ^= ZobPiece[PieceOffset[pos.piece_on(s)] + s];
+        Piece p = pos.piece_on(s);
+        int polyPiece = 2 * (type_of(p) - 1) + (color_of(p) == WHITE);
+        key ^= ZobPiece[64 * polyPiece + s];
     }
 
     b = pos.can_castle(ALL_CASTLES);
@@ -379,7 +378,10 @@ bool Book::open(const char* fName) {
   ifstream::open(fName, ifstream::in | ifstream::binary | ios::ate);
 
   if (!is_open())
+  {
+      clear();
       return false; // Silently fail if the file is not found
+  }
 
   // Get the book size in number of entries, we are already at the end of file
   size = (size_t)tellg() / sizeof(BookEntry);
@@ -440,10 +442,10 @@ Move Book::probe(const Position& pos, const string& fName, bool pickBest) {
   // the special Move's flags (bit 14-15) that are not supported by PolyGlot.
   int pt = (move >> 12) & 7;
   if (pt)
-      move = make_promotion(from_sq(move), to_sq(move), PieceType(pt + 1));
+      move = make<PROMOTION>(from_sq(move), to_sq(move), PieceType(pt + 1));
 
   // Add 'special move' flags and verify it is legal
-  for (MoveList<MV_LEGAL> ml(pos); !ml.end(); ++ml)
+  for (MoveList<LEGAL> ml(pos); !ml.end(); ++ml)
       if (move == (ml.move() & 0x3FFF))
           return ml.move();