X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fpawns.cpp;h=74aa0e0dd95892df9b1cdd44e00dc0c9a6d02638;hp=d05e8af0cd3cf6783410339c3bfff14ca5bf059a;hb=7487eb0dcae93731330f06c7d289ca156487a16f;hpb=5ea984ac3515946d952bd3c9cfe8e8baef7cc85d
diff --git a/src/pawns.cpp b/src/pawns.cpp
index d05e8af0..74aa0e0d 100644
--- a/src/pawns.cpp
+++ b/src/pawns.cpp
@@ -17,6 +17,7 @@
along with this program. If not, see .
*/
+#include
#include
#include "bitboard.h"
@@ -62,15 +63,16 @@ namespace {
S(34,68), S(83,166), S(0, 0), S( 0, 0)
};
- // Weakness of our pawn shelter in front of the king indexed by [king pawn][rank]
- const Value ShelterWeakness[2][RANK_NB] =
- { { V(141), V(0), V(38), V(102), V(128), V(141), V(141) },
- { V( 61), V(0), V(16), V( 44), V( 56), V( 61), V( 61) } };
+ // 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) };
- // Danger of enemy pawns moving toward our king indexed by [pawn blocked][rank]
- const Value StormDanger[2][RANK_NB] =
- { { V(26), V(0), V(128), V(51), V(26) },
- { V(13), V(0), V( 64), V(25), V(13) } };
+ // Danger of enemy pawns moving toward our king indexed by
+ // [no friendly pawn | pawn unblocked | pawn blocked][rank of enemy pawn]
+ 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) }};
// Max bonus for king safety. Corresponds to start position with all the pawns
// in front of the king and no enemy pawn on the horizont.
@@ -93,7 +95,7 @@ namespace {
Rank r;
bool passed, isolated, doubled, opposed, chain, backward, candidate;
Score value = SCORE_ZERO;
- const Square* pl = pos.piece_list(Us, PAWN);
+ const Square* pl = pos.list(Us);
Bitboard ourPawns = pos.pieces(Us, PAWN);
Bitboard theirPawns = pos.pieces(Them, PAWN);
@@ -103,7 +105,7 @@ namespace {
e->semiopenFiles[Us] = 0xFF;
e->pawnAttacks[Us] = shift_bb(ourPawns) | shift_bb(ourPawns);
e->pawnsOnSquares[Us][BLACK] = popcount(ourPawns & BlackSquares);
- e->pawnsOnSquares[Us][WHITE] = pos.piece_count(Us, PAWN) - e->pawnsOnSquares[Us][BLACK];
+ e->pawnsOnSquares[Us][WHITE] = pos.count(Us) - e->pawnsOnSquares[Us][BLACK];
// Loop through all pawns of the current color and score each pawn
while ((s = *pl++) != SQ_NONE)
@@ -134,7 +136,7 @@ namespace {
// be backward. If there are friendly pawns behind on adjacent files
// or if can capture an enemy pawn it cannot be backward either.
if ( !(passed | isolated | chain)
- && !(ourPawns & attack_span_mask(Them, s))
+ && !(ourPawns & pawn_attack_span(Them, s))
&& !(pos.attacks_from(s, Us) & theirPawns))
{
// We now know that there are no friendly pawns beside or behind this
@@ -153,15 +155,15 @@ namespace {
backward = (b | shift_bb(b)) & theirPawns;
}
- assert(opposed | passed | (attack_span_mask(Us, s) & 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
// advance and if the number of friendly pawns beside or behind this
// pawn on adjacent files is higher or equal than the number of
// enemy pawns in the forward direction on the adjacent files.
candidate = !(opposed | passed | backward | isolated)
- && (b = attack_span_mask(Them, s + pawn_push(Us)) & ourPawns) != 0
- && popcount(b) >= popcount(attack_span_mask(Us, s) & theirPawns);
+ && (b = pawn_attack_span(Them, s + pawn_push(Us)) & ourPawns) != 0
+ && popcount(b) >= popcount(pawn_attack_span(Us, s) & theirPawns);
// Passed pawns will be properly scored in evaluation because we need
// full attack info to evaluate passed pawns. Only the frontmost passed
@@ -220,8 +222,8 @@ Value Entry::shelter_storm(const Position& pos, Square ksq) {
const Color Them = (Us == WHITE ? BLACK : WHITE);
Value safety = MaxSafetyBonus;
- Bitboard b = pos.pieces(PAWN) & (in_front_bb(Us, ksq) | rank_bb(ksq));
- Bitboard ourPawns = b & pos.pieces(Us) & ~rank_bb(ksq);
+ Bitboard b = pos.pieces(PAWN) & (in_front_bb(Us, rank_of(ksq)) | rank_bb(ksq));
+ Bitboard ourPawns = b & pos.pieces(Us);
Bitboard theirPawns = b & pos.pieces(Them);
Rank rkUs, rkThem;
File kf = file_of(ksq);
@@ -230,15 +232,13 @@ Value Entry::shelter_storm(const Position& pos, Square ksq) {
for (int f = kf - 1; f <= kf + 1; f++)
{
- // Shelter penalty is higher for the pawn in front of the king
b = ourPawns & FileBB[f];
- rkUs = b ? rank_of(Us == WHITE ? lsb(b) : ~msb(b)) : RANK_1;
- safety -= ShelterWeakness[f != kf][rkUs];
+ rkUs = b ? relative_rank(Us, Us == WHITE ? lsb(b) : msb(b)) : RANK_1;
+ safety -= ShelterWeakness[rkUs];
- // Storm danger is smaller if enemy pawn is blocked
b = theirPawns & FileBB[f];
- rkThem = b ? rank_of(Us == WHITE ? lsb(b) : ~msb(b)) : RANK_1;
- safety -= StormDanger[rkThem == rkUs + 1][rkThem];
+ rkThem = b ? relative_rank(Us, Us == WHITE ? lsb(b) : msb(b)) : RANK_1;
+ safety -= StormDanger[rkUs == RANK_1 ? 0 : rkThem == rkUs + 1 ? 2 : 1][rkThem];
}
return safety;