]> git.sesse.net Git - stockfish/blobdiff - src/evaluate.cpp
Piece mobility: filter out squares protected by pawns
[stockfish] / src / evaluate.cpp
index cf164cda786d94260b1a5c5b7d0ac651cf9bc9c2..d261f4489f164802b52009f8faab5c8e43354ecb 100644 (file)
@@ -575,8 +575,11 @@ namespace {
             ei.kingAdjacentZoneAttacksCount[us] += count_1s_max_15(bb);
     }
 
+    // Remove squares protected by enemy pawns
+    Bitboard bb = (b & ~ei.attackedBy[them][PAWN]);
+
     // Mobility
-    int mob = count_1s_max_15(b & ~p.pieces_of_color(us));
+    int mob = count_1s_max_15(bb & ~p.pieces_of_color(us));
     ei.mgMobility += Sign[us] * mgBonus[mob];
     ei.egMobility += Sign[us] * egBonus[mob];
 
@@ -936,6 +939,13 @@ namespace {
           b2 = squares_in_front_of(us, s);
           b3 = b2 & ei.attacked_by(them);
           b4 = b2 & ei.attacked_by(us);
+
+          // If there is an enemy rook or queen attacking the pawn from behind,
+          // add all X-ray attacks by the rook or queen.
+          if(bit_is_set(ei.attacked_by(them,ROOK)|ei.attacked_by(them,QUEEN),s)
+             && squares_behind(us, s) & pos.rooks_and_queens(them))
+            b3 = b2;
+
           if((b2 & pos.pieces_of_color(them)) == EmptyBoardBB) {
             // There are no enemy pieces in the pawn's path!  Are any of the
             // squares in the pawn's path attacked by the enemy?