extern Bitboard AttackSpanMask[COLOR_NB][SQUARE_NB];
extern Bitboard PseudoAttacks[PIECE_TYPE_NB][SQUARE_NB];
+const Bitboard WhiteSquares = 0x55AA55AA55AA55AAULL;
+const Bitboard BlackSquares = 0xAA55AA55AA55AA55ULL;
/// Overloads of bitwise operators between a Bitboard and a Square for testing
/// whether a given bit is set in a bitboard, and for setting and clearing bits.
&& !more_than_one(BetweenBB[s][pos.king_square(Them)] & pos.pieces()))
score += BishopPinBonus;
+ // Penalty for bishop with same coloured pawns
+ if (Piece == BISHOP)
+ score -= make_score(4, 4) * ei.pi->same_colored_pawn_count(s, Us);
+
// Bishop and knight outposts squares
if ( (Piece == BISHOP || Piece == KNIGHT)
&& !(pos.pieces(Them, PAWN) & attack_span_mask(Us, s)))
const Value RedundantRookPenalty = Value(554);
// pair pawn knight bishop rook queen
- const int LinearCoefficients[6] = { 1617, -162, -1172, -190, 105, 26 };
+ const int LinearCoefficients[6] = { 1617, -162, -1172, -62, 105, 26 };
const int QuadraticCoefficientsSameColor[][PIECE_TYPE_NB] = {
// pair pawn knight bishop rook queen
value += CandidateBonus[relative_rank(Us, s)];
}
+ e->pawnsOnWhiteSquaresCount[Us] = popcount<Max15>(ourPawns & WhiteSquares);
+ e->pawnsOnWhiteSquaresCount[Them] = popcount<Max15>(theirPawns & WhiteSquares);
+
+ e->pawnsOnBlackSquaresCount[Us] = popcount<Max15>(ourPawns & BlackSquares);
+ e->pawnsOnBlackSquaresCount[Them] = popcount<Max15>(theirPawns & BlackSquares);
+
return value;
}
}
int file_is_half_open(Color c, File f) const { return halfOpenFiles[c] & (1 << int(f)); }
int has_open_file_to_left(Color c, File f) const { return halfOpenFiles[c] & ((1 << int(f)) - 1); }
int has_open_file_to_right(Color c, File f) const { return halfOpenFiles[c] & ~((1 << int(f+1)) - 1); }
+ int same_colored_pawn_count(Square s, Color c) const { return (BlackSquares & s) ? pawnsOnBlackSquaresCount[c] : pawnsOnWhiteSquaresCount[c]; }
template<Color Us>
Score king_safety(const Position& pos, Square ksq) {
Score value;
int halfOpenFiles[COLOR_NB];
Score kingSafety[COLOR_NB];
+ int pawnsOnWhiteSquaresCount[COLOR_NB];
+ int pawnsOnBlackSquaresCount[COLOR_NB];
};
typedef HashTable<Entry, 16384> Table;