From 74db0f0f4068ac9520acb16465e328436127bd4f Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sun, 13 Jun 2010 11:05:04 +0100 Subject: [PATCH] Tweak unstoppable pawns detection A pawn is unstoppable also if enemy king can reach it but path to queening is protected. Original idea by Ralph Stoesser fixed by me. Signed-off-by: Marco Costalba --- src/evaluate.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/evaluate.cpp b/src/evaluate.cpp index b9f9ff50..0082fc09 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -900,13 +900,16 @@ namespace { - square_distance(pos.king_square(opposite_color(c)), queeningSquare) + int(c != pos.side_to_move()); - if (d < 0) + // Do we protect the path to queening ? + bool pathDefended = (ei.attacked_by(c) & squares_in_front_of(c, s)) == squares_in_front_of(c, s); + + if (d < 0 || pathDefended) { int mtg = RANK_8 - relative_rank(c, s); int blockerCount = count_1s_max_15(squares_in_front_of(c, s) & pos.occupied_squares()); mtg += blockerCount; d += blockerCount; - if (d < 0 && (!movesToGo[c] || movesToGo[c] > mtg)) + if ((d < 0 || pathDefended) && (!movesToGo[c] || movesToGo[c] > mtg)) { movesToGo[c] = mtg; pawnToGo[c] = s; -- 2.39.2