X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fpawns.cpp;h=d65b0418f0145f448c3d37dff8ecb7262c86fdaf;hp=5a65422cb009b42360c0ef2c5b83134ad7c75b01;hb=457ac26de5e2925c87bdc0169478d138074c50f8;hpb=b9f5d1c6ff1193d7409065322a76f59385baee3e diff --git a/src/pawns.cpp b/src/pawns.cpp index 5a65422c..d65b0418 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -92,7 +92,6 @@ namespace { Bitboard b; Square s; File f; - Rank r; bool passed, isolated, doubled, opposed, chain, backward, candidate; Score value = SCORE_ZERO; const Square* pl = pos.list(Us); @@ -113,13 +112,12 @@ namespace { assert(pos.piece_on(s) == make_piece(Us, PAWN)); f = file_of(s); - r = rank_of(s); // This file cannot be semi-open e->semiopenFiles[Us] &= ~(1 << f); // Our rank plus previous one. Used for chain detection - b = rank_bb(r) | rank_bb(Us == WHITE ? r - Rank(1) : r + Rank(1)); + b = rank_bb(s) | rank_bb(s - pawn_push(Us)); // Flag the pawn as passed, isolated, doubled or member of a pawn // chain (but not the backward one). @@ -142,16 +140,12 @@ namespace { // We now know that there are no friendly pawns beside or behind this // pawn on adjacent files. We now check whether the pawn is // backward by looking in the forward direction on the adjacent - // files, and seeing whether we meet a friendly or an enemy pawn first. - b = pos.attacks_from(s, Us); + // files, and picking the closest pawn there. + b = pawn_attack_span(Us, s) & (ourPawns | theirPawns); + b = pawn_attack_span(Us, s) & rank_bb(backmost_sq(Us, b)); - // Note that we are sure to find something because pawn is not passed - // nor isolated, so loop is potentially infinite, but it isn't. - while (!(b & (ourPawns | theirPawns))) - b = shift_bb(b); - - // The friendly pawn needs to be at least two ranks closer than the - // enemy pawn in order to help the potentially backward pawn advance. + // If we have an enemy pawn in the same or next rank, the pawn is + // backward because it cannot advance without being captured. backward = (b | shift_bb(b)) & theirPawns; } @@ -226,18 +220,16 @@ Value Entry::shelter_storm(const Position& pos, Square ksq) { Bitboard ourPawns = b & pos.pieces(Us); Bitboard theirPawns = b & pos.pieces(Them); Rank rkUs, rkThem; - File kf = file_of(ksq); - - kf = (kf == FILE_A) ? FILE_B : (kf == FILE_H) ? FILE_G : kf; + File kf = std::max(FILE_B, std::min(FILE_G, file_of(ksq))); for (int f = kf - 1; f <= kf + 1; f++) { b = ourPawns & FileBB[f]; - rkUs = b ? relative_rank(Us, Us == WHITE ? lsb(b) : msb(b)) : RANK_1; + rkUs = b ? relative_rank(Us, backmost_sq(Us, b)) : RANK_1; safety -= ShelterWeakness[rkUs]; b = theirPawns & FileBB[f]; - rkThem = b ? relative_rank(Us, Us == WHITE ? lsb(b) : msb(b)) : RANK_1; + rkThem = b ? relative_rank(Us, frontmost_sq(Them, b)) : RANK_1; safety -= StormDanger[rkUs == RANK_1 ? 0 : rkThem == rkUs + 1 ? 2 : 1][rkThem]; }