X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fpawns.cpp;h=10f67236f61500bcddd8e237005a9e323eeae1ed;hp=03b422f8b1155252a7a8930eae5e87a5523fc377;hb=728ce2195c505b73305d21a326cee4010d5dbf0e;hpb=9f8f093fd63f612ff28ca8b4812d0701f6d64ea7 diff --git a/src/pawns.cpp b/src/pawns.cpp index 03b422f8..10f67236 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -99,8 +99,9 @@ namespace { const Square Left = (Us == WHITE ? NORTH_WEST : SOUTH_EAST); Bitboard b, neighbours, stoppers, doubled, supported, phalanx; + Bitboard lever, leverPush, connected; Square s; - bool opposed, lever, connected, backward; + bool opposed, backward; Score score = SCORE_ZERO; const Square* pl = pos.squares(Us); const Bitboard* pawnAttacksBB = StepAttacksBB[make_piece(Us, PAWN)]; @@ -129,6 +130,7 @@ namespace { opposed = theirPawns & forward_bb(Us, s); stoppers = theirPawns & passed_pawn_mask(Us, s); lever = theirPawns & pawnAttacksBB[s]; + leverPush = theirPawns & pawnAttacksBB[s + Up]; doubled = ourPawns & (s + Up); neighbours = ourPawns & adjacent_files_bb(f); phalanx = neighbours & rank_bb(s); @@ -153,8 +155,13 @@ namespace { } // Passed pawns will be properly scored in evaluation because we need - // full attack info to evaluate them. - if (!stoppers && !(ourPawns & forward_bb(Us, s))) + // full attack info to evaluate them. Include also not passed pawns + // which could become passed after one or two pawn pushes when are + // not attacked more times than defended. + if ( !(stoppers ^ lever ^ leverPush) + && !(ourPawns & forward_bb(Us, s)) + && popcount(supported) >= popcount(lever) + && popcount(phalanx) >= popcount(leverPush)) e->passedPawns[Us] |= s; // Score this pawn @@ -249,12 +256,13 @@ Value Entry::shelter_storm(const Position& pos, Square ksq) { b = theirPawns & file_bb(f); Rank rkThem = b ? relative_rank(Us, frontmost_sq(Them, b)) : RANK_1; - safety -= ShelterWeakness[std::min(f, FILE_H - f)][rkUs] + int d = std::min(f, FILE_H - f); + safety -= ShelterWeakness[d][rkUs] + StormDanger [f == file_of(ksq) && rkThem == relative_rank(Us, ksq) + 1 ? BlockedByKing : rkUs == RANK_1 ? Unopposed : rkThem == rkUs + 1 ? BlockedByPawn : Unblocked] - [std::min(f, FILE_H - f)][rkThem]; + [d][rkThem]; } return safety;