X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fpawns.cpp;h=069c8d9401aa29127699235ee9e6cb872384d367;hp=795e31e2423941a3a973187d83c2d2b080b353c8;hb=55bd27b8f08a151128d7065fa2819aa3e9605299;hpb=32c504076f5a1d5c84f88c2d30a11c25ea2e5a6e diff --git a/src/pawns.cpp b/src/pawns.cpp index 795e31e2..069c8d94 100644 --- a/src/pawns.cpp +++ b/src/pawns.cpp @@ -104,8 +104,8 @@ PawnEntry* PawnTable::probe(const Position& pos) { e->kingSquares[WHITE] = e->kingSquares[BLACK] = SQ_NONE; e->halfOpenFiles[WHITE] = e->halfOpenFiles[BLACK] = 0xFF; - Bitboard wPawns = pos.pieces(PAWN, WHITE); - Bitboard bPawns = pos.pieces(PAWN, BLACK); + Bitboard wPawns = pos.pieces(WHITE, PAWN); + Bitboard bPawns = pos.pieces(BLACK, PAWN); e->pawnAttacks[WHITE] = ((wPawns & ~FileHBB) << 9) | ((wPawns & ~FileABB) << 7); e->pawnAttacks[BLACK] = ((bPawns & ~FileHBB) >> 7) | ((bPawns & ~FileABB) >> 9); @@ -152,8 +152,8 @@ Score PawnTable::evaluate_pawns(const Position& pos, Bitboard ourPawns, // chain (but not the backward one). chain = ourPawns & adjacent_files_bb(f) & b; isolated = !(ourPawns & adjacent_files_bb(f)); - doubled = ourPawns & squares_in_front_of(Us, s); - opposed = theirPawns & squares_in_front_of(Us, s); + doubled = ourPawns & forward_bb(Us, s); + opposed = theirPawns & forward_bb(Us, s); passed = !(theirPawns & passed_pawn_mask(Us, s)); // Test for backward pawn @@ -240,12 +240,12 @@ Value PawnEntry::shelter_storm(const Position& pos, Square ksq) { { // Shelter penalty is higher for the pawn in front of the king b = ourPawns & FileBB[f]; - rkUs = b ? rank_of(Us == WHITE ? first_1(b) : ~last_1(b)) : RANK_1; + rkUs = b ? rank_of(Us == WHITE ? lsb(b) : ~msb(b)) : RANK_1; safety -= ShelterWeakness[f != kf][rkUs]; // Storm danger is smaller if enemy pawn is blocked b = theirPawns & FileBB[f]; - rkThem = b ? rank_of(Us == WHITE ? first_1(b) : ~last_1(b)) : RANK_1; + rkThem = b ? rank_of(Us == WHITE ? lsb(b) : ~msb(b)) : RANK_1; safety -= StormDanger[rkThem == rkUs + 1][rkThem]; } @@ -260,20 +260,26 @@ template Score PawnEntry::update_safety(const Position& pos, Square ksq) { kingSquares[Us] = ksq; + castleRights[Us] = pos.can_castle(Us); + minKPdistance[Us] = 0; + + Bitboard pawns = pos.pieces(Us, PAWN); + if (pawns) + while (!(DistanceRingsBB[ksq][minKPdistance[Us]++] & pawns)) {} if (relative_rank(Us, ksq) > RANK_4) - return kingSafety[Us] = SCORE_ZERO; + return kingSafety[Us] = make_score(0, -16 * minKPdistance[Us]); Value bonus = shelter_storm(pos, ksq); // If we can castle use the bonus after the castle if is bigger - if (pos.can_castle(Us == WHITE ? WHITE_OO : BLACK_OO)) + if (pos.can_castle(make_castle_right(Us, KING_SIDE))) bonus = std::max(bonus, shelter_storm(pos, relative_square(Us, SQ_G1))); - if (pos.can_castle(Us == WHITE ? WHITE_OOO : BLACK_OOO)) + if (pos.can_castle(make_castle_right(Us, QUEEN_SIDE))) bonus = std::max(bonus, shelter_storm(pos, relative_square(Us, SQ_C1))); - return kingSafety[Us] = make_score(bonus, 0); + return kingSafety[Us] = make_score(bonus, -16 * minKPdistance[Us]); } // Explicit template instantiation