X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fpawns.cpp;h=c5a48e930c134e361f3733391e1ee79f6e7f510a;hp=fece246b1c999a31611a8b8661b4e97d8e9520e2;hb=10cb19d5348b33079ceecba1b47f8d17c87231c9;hpb=aecdbfc4a000c72fcc2642f54ce83967913a16ba diff --git a/src/pawns.cpp b/src/pawns.cpp index fece246b..c5a48e93 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -99,7 +99,7 @@ namespace { Bitboard ourPawns = pos.pieces(Us, PAWN); Bitboard theirPawns = pos.pieces(Them, PAWN); - e->passedPawns[Us] = 0; + e->passedPawns[Us] = e->candidatePawns[Us] = 0; e->kingSquares[Us] = SQ_NONE; e->semiopenFiles[Us] = 0xFF; e->pawnAttacks[Us] = shift_bb(ourPawns) | shift_bb(ourPawns); @@ -140,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; } @@ -183,7 +179,12 @@ namespace { value += ChainMember[f]; if (candidate) + { value += CandidatePassed[relative_rank(Us, s)]; + + if (!doubled) + e->candidatePawns[Us] |= s; + } } return value; @@ -229,11 +230,11 @@ Value Entry::shelter_storm(const Position& pos, Square ksq) { for (int f = kf - 1; f <= kf + 1; f++) { b = ourPawns & FileBB[f]; - rkUs = b ? relative_rank(Us, lsb(Us, 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, lsb(Us, 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]; }