]> git.sesse.net Git - stockfish/blobdiff - src/position.cpp
Dynamic draw value
[stockfish] / src / position.cpp
index 325f3e4db6b2ce023eadef0e575e0245237ec0f3..78fccbb2891d8fb70b1d7e5d406ba985c88daccf 100644 (file)
@@ -1013,7 +1013,7 @@ void Position::undo_null_move() {
 /// Position::see() is a static exchange evaluator: It tries to estimate the
 /// material gain or loss resulting from a move.
 
-int Position::see_sign(Move m) const {
+Value Position::see_sign(Move m) const {
 
   assert(is_ok(m));
 
@@ -1021,16 +1021,17 @@ int Position::see_sign(Move m) const {
   // is not less then capturing one. Note that king moves always return
   // here because king midgame value is set to 0.
   if (PieceValue[MG][moved_piece(m)] <= PieceValue[MG][piece_on(to_sq(m))])
-      return 1;
+      return VALUE_KNOWN_WIN;
 
   return see(m);
 }
 
-int Position::see(Move m) const {
+Value Position::see(Move m) const {
 
   Square from, to;
   Bitboard occupied, attackers, stmAttackers;
-  int swapList[32], slIndex = 1;
+  Value swapList[32];
+  int slIndex = 1;
   PieceType captured;
   Color stm;
 
@@ -1046,7 +1047,7 @@ int Position::see(Move m) const {
   // handled correctly. Simply return 0 that is always the correct value
   // unless in the rare case the rook ends up under attack.
   if (type_of(m) == CASTLING)
-      return 0;
+      return VALUE_ZERO;
 
   if (type_of(m) == ENPASSANT)
   {
@@ -1077,20 +1078,23 @@ int Position::see(Move m) const {
 
       // Add the new entry to the swap list
       swapList[slIndex] = -swapList[slIndex - 1] + PieceValue[MG][captured];
-      ++slIndex;
 
       // Locate and remove the next least valuable attacker
       captured = min_attacker<PAWN>(byTypeBB, to, stmAttackers, occupied, attackers);
-      stm = ~stm;
-      stmAttackers = attackers & pieces(stm);
 
       // Stop before processing a king capture
-      if (captured == KING && stmAttackers)
+      if (captured == KING)
       {
-          swapList[slIndex++] = QueenValueMg * 16;
+          if (stmAttackers == attackers)
+              ++slIndex;
+
           break;
       }
 
+      stm = ~stm;
+      stmAttackers = attackers & pieces(stm);
+      ++slIndex;
+
   } while (stmAttackers);
 
   // Having built the swap list, we negamax through it to find the best
@@ -1173,7 +1177,7 @@ Key Position::compute_material_key() const {
   Key k = 0;
 
   for (Color c = WHITE; c <= BLACK; ++c)
-      for (PieceType pt = PAWN; pt <= QUEEN; ++pt)
+      for (PieceType pt = PAWN; pt <= KING; ++pt)
           for (int cnt = 0; cnt < pieceCount[c][pt]; ++cnt)
               k ^= Zobrist::psq[c][pt][cnt];