constexpr Score Isolated = S( 5, 15);
// Connected pawn bonus
- constexpr int Connected[RANK_NB] = { 0, 13, 24, 18, 65, 100, 175, 330 };
+ constexpr int Connected[RANK_NB] = { 0, 13, 17, 24, 59, 96, 171 };
// Strength of pawn shelter for our king by [distance from edge][rank].
// RANK_1 = 0 is used for files where we have no pawn, or pawn is behind our king.
Bitboard theirPawns = pos.pieces(Them, PAWN);
e->passedPawns[Us] = e->pawnAttacksSpan[Us] = e->weakUnopposed[Us] = 0;
- e->semiopenFiles[Us] = 0xFF;
e->kingSquares[Us] = SQ_NONE;
e->pawnAttacks[Us] = pawn_attacks_bb<Us>(ourPawns);
- e->pawnsOnSquares[Us][BLACK] = popcount(ourPawns & DarkSquares);
- e->pawnsOnSquares[Us][WHITE] = pos.count<PAWN>(Us) - e->pawnsOnSquares[Us][BLACK];
// Loop through all pawns of the current color and score each pawn
while ((s = *pl++) != SQ_NONE)
assert(pos.piece_on(s) == make_piece(Us, PAWN));
File f = file_of(s);
+ Rank r = relative_rank(Us, s);
- e->semiopenFiles[Us] &= ~(1 << f);
e->pawnAttacksSpan[Us] |= pawn_attack_span(Us, s);
// Flag the pawn
&& popcount(phalanx) >= popcount(leverPush))
e->passedPawns[Us] |= s;
- else if ( stoppers == square_bb(s + Up)
- && relative_rank(Us, s) >= RANK_5)
+ else if (stoppers == square_bb(s + Up) && r >= RANK_5)
{
b = shift<Up>(support) & ~theirPawns;
while (b)
// Score this pawn
if (support | phalanx)
{
- int r = relative_rank(Us, s);
- int v = phalanx ? Connected[r] + Connected[r + 1] : 2 * Connected[r];
+ int v = (phalanx ? 3 : 2) * Connected[r];
v = 17 * popcount(support) + (v >> (opposed + 1));
score += make_score(v, v * (r - 2) / 4);
}
e->key = key;
e->scores[WHITE] = evaluate<WHITE>(pos, e);
e->scores[BLACK] = evaluate<BLACK>(pos, e);
- e->passedCount= popcount(e->passedPawns[WHITE] | e->passedPawns[BLACK]);
return e;
}
Square ksq = pos.square<KING>(Us);
kingSquares[Us] = ksq;
castlingRights[Us] = pos.castling_rights(Us);
- int minKingPawnDistance = 0;
Bitboard pawns = pos.pieces(Us, PAWN);
- if (pawns)
- while (!(DistanceRingBB[ksq][++minKingPawnDistance] & pawns)) {}
+ int minPawnDist = pawns ? 8 : 0;
+
+ if (pawns & PseudoAttacks[KING][ksq])
+ minPawnDist = 1;
+
+ else while (pawns)
+ minPawnDist = std::min(minPawnDist, distance(ksq, pop_lsb(&pawns)));
Value bonus = evaluate_shelter<Us>(pos, ksq);
if (pos.can_castle(Us | QUEEN_SIDE))
bonus = std::max(bonus, evaluate_shelter<Us>(pos, relative_square(Us, SQ_C1)));
- return make_score(bonus, -16 * minKingPawnDistance);
+ return make_score(bonus, -16 * minPawnDist);
}
// Explicit template instantiation