From: Marco Costalba Date: Sat, 25 Oct 2014 05:03:42 +0000 (+0200) Subject: Reformat max_threat() X-Git-Url: https://git.sesse.net/?p=stockfish;a=commitdiff_plain;h=4f6b1bf3bee68f138d1b5fc234fd25901cffa42c;hp=8d62ece9459b8338c27cf1fb52e27ea85d8061d5 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. --- diff --git a/src/evaluate.cpp b/src/evaluate.cpp index d03ae665..ad420fbd 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -490,24 +490,21 @@ namespace { 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 FORCE_INLINE - Score max_threat(const Bitboard targets, const Position& pos, const Score threat_values[]) { + // max_piece_type() is a helper function used by evaluate_threats() to get + // the value of the biggest PieceType of color C in 'target' bitboard. - const Color Them = (Us == WHITE ? BLACK : WHITE); + template + inline PieceType max_piece_type(const Position& pos, const Bitboard target) { + + assert(target & (pos.pieces(C) ^ pos.pieces(C, KING))); - PieceType threat = PAWN; - 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 // and the type of attacked one. @@ -516,34 +513,34 @@ namespace { const Color Them = (Us == WHITE ? BLACK : WHITE); + enum { Minor, Major }; + Bitboard b, weakEnemies, protectedEnemies; Score score = SCORE_ZERO; - enum { Minor, Major }; - // Protected enemies - protectedEnemies = (pos.pieces(Them) ^ pos.pieces(Them,PAWN)) - & ei.attackedBy[Them][PAWN] + // 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[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]); if (protectedEnemies) - score += max_threat(protectedEnemies, pos, Threat[Minor]); - + score += Threat[Minor][max_piece_type(pos, protectedEnemies)]; // Enemies not defended by a pawn and under our attack - weakEnemies = pos.pieces(Them) + weakEnemies = pos.pieces(Them) & ~ei.attackedBy[Them][PAWN] - & ei.attackedBy[Us][ALL_PIECES]; + & ei.attackedBy[Us][ALL_PIECES]; // Add a bonus according if the attacking pieces are minor or major if (weakEnemies) { b = weakEnemies & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]); if (b) - score += max_threat(b, pos, Threat[Minor]); + score += Threat[Minor][max_piece_type(pos, b)]; b = weakEnemies & (ei.attackedBy[Us][ROOK] | ei.attackedBy[Us][QUEEN]); if (b) - score += max_threat(b, pos, Threat[Major]); + score += Threat[Major][max_piece_type(pos, b)]; b = weakEnemies & ~ei.attackedBy[Them][ALL_PIECES]; if (b)