S( 0, 0), S( 6, 13), S(6,13), S(14,29),
S(34,68), S(83,166), S(0, 0), S( 0, 0) };
+ // Bonus for file distance of the two outermost pawns
+ const Score PawnsFileSpan = S(0, 15);
+
// Weakness of our pawn shelter in front of the king indexed by [rank]
const Value ShelterWeakness[RANK_NB] =
{ V(100), V(0), V(27), V(73), V(92), V(101), V(101) };
// Test for backward pawn.
// If the pawn is passed, isolated, or member of a pawn chain it cannot
// be backward. If there are friendly pawns behind on adjacent files
- // or if can capture an enemy pawn it cannot be backward either.
+ // or if it can capture an enemy pawn it cannot be backward either.
if ( (passed | isolated | chain)
|| (ourPawns & pawn_attack_span(Them, s))
|| (pos.attacks_from<PAWN>(s, Us) & theirPawns))
assert(opposed | passed | (pawn_attack_span(Us, s) & theirPawns));
- // A not passed pawn is a candidate to become passed, if it is free to
+ // A not-passed pawn is a candidate to become passed, if it is free to
// advance and if the number of friendly pawns beside or behind this
- // pawn on adjacent files is higher or equal than the number of
+ // pawn on adjacent files is higher than or equal to the number of
// enemy pawns in the forward direction on the adjacent files.
candidate = !(opposed | passed | backward | isolated)
&& (b = pawn_attack_span(Them, s + pawn_push(Us)) & ourPawns) != 0
}
}
+ // In endgame it's better to have pawns on both wings. So give a bonus according
+ // to file distance between left and right outermost pawns.
+ if (pos.count<PAWN>(Us) > 1)
+ {
+ b = e->semiopenFiles[Us] ^ 0xFF;
+ value += PawnsFileSpan * int(msb(b) - lsb(b));
+ }
+
return value;
}