#include "evaluate.h"
#include "material.h"
#include "pawns.h"
-
-std::atomic<Score> Eval::Contempt;
+#include "thread.h"
namespace Trace {
if (relative_rank(Us, pos.square<KING>(Us)) == RANK_1)
kingRing[Us] |= shift<Up>(kingRing[Us]);
+ if (file_of(pos.square<KING>(Us)) == FILE_H)
+ kingRing[Us] |= shift<WEST>(kingRing[Us]);
+
+ else if (file_of(pos.square<KING>(Us)) == FILE_A)
+ kingRing[Us] |= shift<EAST>(kingRing[Us]);
+
kingAttackersCount[Them] = popcount(attackedBy[Us][KING] & pe->pawn_attacks(Them));
kingAttacksCount[Them] = kingAttackersWeight[Them] = 0;
}
if (Pt == ROOK)
{
- // Bonus for aligning rook with with enemy pawns on the same rank/file
+ // Bonus for aligning rook with enemy pawns on the same rank/file
if (relative_rank(Us, s) >= RANK_5)
score += RookOnPawn * popcount(pos.pieces(Them, PAWN) & PseudoAttacks[ROOK][s]);
constexpr Color Them = (Us == WHITE ? BLACK : WHITE);
constexpr Bitboard Camp = (Us == WHITE ? AllSquares ^ Rank6BB ^ Rank7BB ^ Rank8BB
- : AllSquares ^ Rank1BB ^ Rank2BB ^ Rank3BB);
+ : AllSquares ^ Rank1BB ^ Rank2BB ^ Rank3BB);
const Square ksq = pos.square<KING>(Us);
Bitboard weak, b, b1, b2, safe, unsafeChecks, pinned;
}
else if (pos.pieces(Us) & blockSq)
bonus += make_score(w + r * 2, w + r * 2);
- } // rr != 0
+ } // w != 0
// Scale down bonus for candidate passers which need more than one
// pawn push to become passed or have a pawn in front of them.
{
if (pos.opposite_bishops())
{
- // Endgame with opposite-colored bishops and no other pieces (ignoring pawns)
- // is almost a draw, in case of KBP vs KB, it is even more a draw.
+ // Endgame with opposite-colored bishops and no other pieces is almost a draw
if ( pos.non_pawn_material(WHITE) == BishopValueMg
&& pos.non_pawn_material(BLACK) == BishopValueMg)
- sf = more_than_one(pos.pieces(PAWN)) ? 31 : 9;
+ sf = 31;
// Endgame with opposite-colored bishops, but also other pieces. Still
// a bit drawish, but not as drawish as with only the two bishops.
// Initialize score by reading the incrementally updated scores included in
// the position object (material + piece square tables) and the material
// imbalance. Score is computed internally from the white point of view.
- Score score = pos.psq_score() + me->imbalance() + Eval::Contempt;
+ Score score = pos.psq_score() + me->imbalance() + pos.this_thread()->contempt;
// Probe the pawn hash table
pe = Pawns::probe(pos);
std::memset(scores, 0, sizeof(scores));
- Eval::Contempt = SCORE_ZERO; // Reset any dynamic contempt
+ pos.this_thread()->contempt = SCORE_ZERO; // Reset any dynamic contempt
Value v = Evaluation<TRACE>(pos).value();