X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fevaluate.cpp;h=f5eece7dc0725f8c72f8c91ec75838ba4e7788d7;hp=fb11b262fd7877bc453bed1976a15d5d8aac804a;hb=61a6e4666400b1855394e342f3a5c5fe125f4f1f;hpb=966bc477af9eae9be63b08111a76e8306263e4a3 diff --git a/src/evaluate.cpp b/src/evaluate.cpp index fb11b262..f5eece7d 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -158,6 +158,8 @@ namespace { S(0, 0), S(0, 0), S(107, 138), S(84, 122), S(114, 203), S(121, 217) }; + const Score ThreatenedByHangingPawn = S(40, 60); + // Assorted bonuses and penalties used by evaluation const Score KingOnOne = S( 2, 58); const Score KingOnMany = S( 6,125); @@ -305,11 +307,6 @@ namespace { mobility[Us] += MobilityBonus[Pt][mob]; - // Decrease score if we are attacked by an enemy pawn. The remaining part - // of threat evaluation must be done later when we have full attack info. - if (ei.attackedBy[Them][PAWN] & s) - score -= ThreatenedByPawn[Pt]; - if (Pt == BISHOP || Pt == KNIGHT) { // Bonus for outpost square @@ -501,9 +498,27 @@ namespace { enum { Defended, Weak }; enum { Minor, Major }; - Bitboard b, weak, defended; + Bitboard b, weak, defended, safe_pawns, safe_pawn_threats, unsafe_pawn_threats; Score score = SCORE_ZERO; + // Pawn Threats + b = ei.attackedBy[Us][PAWN] & (pos.pieces(Them) ^ pos.pieces(Them, PAWN)); + + if (b) + { + safe_pawns = pos.pieces(Us, PAWN) & (~ei.attackedBy[Them][ALL_PIECES] | ei.attackedBy[Us][ALL_PIECES]); + safe_pawn_threats = (shift_bb(safe_pawns) | shift_bb(safe_pawns)) & (pos.pieces(Them) ^ pos.pieces(Them, PAWN)); + unsafe_pawn_threats = b ^ safe_pawn_threats; + + // Unsafe pawn threats + if (unsafe_pawn_threats) + score += ThreatenedByHangingPawn; + + // Evaluate safe pawn threats + while (safe_pawn_threats) + score += ThreatenedByPawn[type_of(pos.piece_on(pop_lsb(&safe_pawn_threats)))]; + } + // Non-pawn enemies defended by a pawn defended = (pos.pieces(Them) ^ pos.pieces(Them, PAWN)) & ei.attackedBy[Them][PAWN];