S( 0, 0), S( 6, 13), S(6,13), S(14,29),
S(34,68), S(83,166), S(0, 0), S( 0, 0) };
+ // Levers bonus by rank
+ const Score Lever[RANK_NB] = {
+ S( 0, 0), S( 0, 0), S(0, 0), S(0, 0),
+ S(20,20), S(40,40), S(0, 0), S(0, 0) };
+
// Bonus for file distance of the two outermost pawns
const Score PawnsFileSpan = S(0, 15);
const Value StormDanger[3][RANK_NB] = {
{ V( 0), V(64), V(128), V(51), V(26) },
{ V(26), V(32), V( 96), V(38), V(20) },
- { V( 0), V( 0), V( 64), V(25), V(13) } };
+ { V( 0), V( 0), V(160), V(25), V(13) } };
// Max bonus for king safety. Corresponds to start position with all the pawns
// in front of the king and no enemy pawn on the horizon.
Bitboard b, p, doubled;
Square s;
File f;
- bool passed, isolated, opposed, connected, backward, candidate, unsupported;
+ bool passed, isolated, opposed, connected, backward, candidate, unsupported, lever;
Score value = SCORE_ZERO;
const Square* pl = pos.list<PAWN>(Us);
+ const Bitboard* pawnAttacksBB = StepAttacksBB[make_piece(Us, PAWN)];
Bitboard ourPawns = pos.pieces(Us, PAWN);
Bitboard theirPawns = pos.pieces(Them, PAWN);
doubled = ourPawns & forward_bb(Us, s);
opposed = theirPawns & forward_bb(Us, s);
passed = !(theirPawns & passed_pawn_mask(Us, s));
+ lever = theirPawns & pawnAttacksBB[s];
// Test for backward pawn.
// If the pawn is passed, isolated, or connected it cannot be
if (connected)
value += Connected[f][relative_rank(Us, s)];
+ if (lever)
+ value += Lever[relative_rank(Us, s)];
+
if (candidate)
{
value += CandidatePassed[relative_rank(Us, s)];
if ( (MiddleEdges & make_square(f, rkThem))
&& file_of(ksq) == f
&& relative_rank(Us, ksq) == rkThem - 1)
- safety += Value(200);
+ safety += 200;
else
safety -= ShelterWeakness[rkUs]
+ StormDanger[rkUs == RANK_1 ? 0 : rkThem == rkUs + 1 ? 2 : 1][rkThem];