diff --git a/src/evaluate.cpp b/src/evaluate.cpp index fadc0fea..ee98da90 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -135,7 +135,7 @@ namespace { constexpr Score KnightOnQueen = S( 16, 12); constexpr Score LongDiagonalBishop = S( 45, 0); constexpr Score MinorBehindPawn = S( 18, 3); - constexpr Score Outpost = S( 18, 6); + constexpr Score Outpost = S( 16, 5); constexpr Score PassedFile = S( 11, 8); constexpr Score PawnlessFlank = S( 17, 95); constexpr Score RestrictedPiece = S( 7, 7); diff --git a/src/pawns.cpp b/src/pawns.cpp index 50eb3aa3..8022ae51 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -71,10 +71,10 @@ namespace { constexpr Color Them = (Us == WHITE ? BLACK : WHITE); constexpr Direction Up = (Us == WHITE ? NORTH : SOUTH); - Bitboard neighbours, stoppers, support, phalanx; + Bitboard neighbours, stoppers, support, phalanx, opposed; Bitboard lever, leverPush; Square s; - bool opposed, backward, passed, doubled; + bool backward, passed, doubled; Score score = SCORE_ZERO; const Square* pl = pos.squares(Us); @@ -94,8 +94,6 @@ namespace { Rank r = relative_rank(Us, s); - e->pawnAttacksSpan[Us] |= pawn_attack_span(Us, s); - // Flag the pawn opposed = theirPawns & forward_file_bb(Us, s); stoppers = theirPawns & passed_pawn_span(Us, s); @@ -112,6 +110,17 @@ namespace { backward = !(neighbours & forward_ranks_bb(Them, s)) && (stoppers & (leverPush | (s + Up))); + // Span of backward pawns and span behind opposing pawns are not included + // in the pawnAttacksSpan bitboard. + if (!backward || phalanx) + { + if (opposed) + e->pawnAttacksSpan[Us] |= pawn_attack_span(Us, s) & + ~pawn_attack_span(Us, frontmost_sq(Them, opposed)); + else + e->pawnAttacksSpan[Us] |= pawn_attack_span(Us, s); + } + // A pawn is passed if one of the three following conditions is true: // (a) there is no stoppers except some levers // (b) the only stoppers are the leverPush, but we outnumber them @@ -130,17 +139,19 @@ namespace { // Score this pawn if (support | phalanx) { - int v = Connected[r] * (2 + bool(phalanx) - opposed) + int v = Connected[r] * (2 + bool(phalanx) - bool(opposed)) + 21 * popcount(support); score += make_score(v, v * (r - 2) / 4); } else if (!neighbours) - score -= Isolated + WeakUnopposed * !opposed; + score -= Isolated + + WeakUnopposed * !opposed; else if (backward) - score -= Backward + WeakUnopposed * !opposed; + score -= Backward + + WeakUnopposed * !opposed; if (!support) score -= Doubled * doubled