1
0
Fork 0
mirror of https://github.com/sockspls/badfish synced 2025-05-01 01:03:09 +00:00

Reformat max_threat()

Helper function should just know how to find the
biggest piece type in a bitboard. All the threat
logic and data shoud be in evaluate_threats().

This nicely separates the scope of the two functions
in a more consistent way and simplifies the code.

No functional change.
This commit is contained in:
Marco Costalba 2014-10-25 07:03:42 +02:00 committed by Joona Kiiski
parent 8d62ece945
commit 4f6b1bf3be

View file

@ -490,24 +490,21 @@ namespace {
return score; return score;
} }
// max_threat() is a helper function to calculate the score of a set of threats.
// The set of threatened pieces is in the "targets" parameter, and we return
// the value of the threat on the biggest piece.
template<Color Us> FORCE_INLINE // max_piece_type() is a helper function used by evaluate_threats() to get
Score max_threat(const Bitboard targets, const Position& pos, const Score threat_values[]) { // the value of the biggest PieceType of color C in 'target' bitboard.
const Color Them = (Us == WHITE ? BLACK : WHITE); template<Color C>
inline PieceType max_piece_type(const Position& pos, const Bitboard target) {
PieceType threat = PAWN; assert(target & (pos.pieces(C) ^ pos.pieces(C, KING)));
if (targets & pos.pieces(Them, KNIGHT)) threat = KNIGHT;
if (targets & pos.pieces(Them, BISHOP)) threat = BISHOP;
if (targets & pos.pieces(Them, ROOK)) threat = ROOK;
if (targets & pos.pieces(Them, QUEEN)) threat = QUEEN;
return threat_values[threat]; PieceType pt;
for (pt = QUEEN; !(target & pos.pieces(C, pt)); --pt) {}
return pt;
} }
// evaluate_threats() assigns bonuses according to the type of attacking piece // evaluate_threats() assigns bonuses according to the type of attacking piece
// and the type of attacked one. // and the type of attacked one.
@ -516,18 +513,18 @@ namespace {
const Color Them = (Us == WHITE ? BLACK : WHITE); const Color Them = (Us == WHITE ? BLACK : WHITE);
Bitboard b, weakEnemies, protectedEnemies;
Score score = SCORE_ZERO;
enum { Minor, Major }; enum { Minor, Major };
// Protected enemies Bitboard b, weakEnemies, protectedEnemies;
protectedEnemies = (pos.pieces(Them) ^ pos.pieces(Them,PAWN)) Score score = SCORE_ZERO;
// Enemies defended by a pawn and under our attack by a minor piece
protectedEnemies = (pos.pieces(Them) ^ pos.pieces(Them, PAWN))
& ei.attackedBy[Them][PAWN] & ei.attackedBy[Them][PAWN]
& (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]); & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]);
if (protectedEnemies) if (protectedEnemies)
score += max_threat<Us>(protectedEnemies, pos, Threat[Minor]); score += Threat[Minor][max_piece_type<Them>(pos, protectedEnemies)];
// Enemies not defended by a pawn and under our attack // Enemies not defended by a pawn and under our attack
weakEnemies = pos.pieces(Them) weakEnemies = pos.pieces(Them)
@ -539,11 +536,11 @@ namespace {
{ {
b = weakEnemies & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]); b = weakEnemies & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]);
if (b) if (b)
score += max_threat<Us>(b, pos, Threat[Minor]); score += Threat[Minor][max_piece_type<Them>(pos, b)];
b = weakEnemies & (ei.attackedBy[Us][ROOK] | ei.attackedBy[Us][QUEEN]); b = weakEnemies & (ei.attackedBy[Us][ROOK] | ei.attackedBy[Us][QUEEN]);
if (b) if (b)
score += max_threat<Us>(b, pos, Threat[Major]); score += Threat[Major][max_piece_type<Them>(pos, b)];
b = weakEnemies & ~ei.attackedBy[Them][ALL_PIECES]; b = weakEnemies & ~ei.attackedBy[Them][ALL_PIECES];
if (b) if (b)