evaluate_knight(pos, pos.piece_list(c, KNIGHT, i), c, ei);
// Bishops
evaluate_knight(pos, pos.piece_list(c, KNIGHT, i), c, ei);
// Bishops
evaluate_bishop(pos, pos.piece_list(c, BISHOP, i), c, ei);
// Rooks
evaluate_bishop(pos, pos.piece_list(c, BISHOP, i), c, ei);
// Rooks
evaluate_rook(pos, pos.piece_list(c, ROOK, i), c, ei);
// Queens
evaluate_rook(pos, pos.piece_list(c, ROOK, i), c, ei);
// Queens
evaluate_queen(pos, pos.piece_list(c, QUEEN, i), c, ei);
// Special pattern: trapped bishops on a7/h7/a2/h2
evaluate_queen(pos, pos.piece_list(c, QUEEN, i), c, ei);
// Special pattern: trapped bishops on a7/h7/a2/h2
{
// Check for KBP vs KB with only a single pawn that is almost
// certainly a draw or at least two pawns.
{
// Check for KBP vs KB with only a single pawn that is almost
// certainly a draw or at least two pawns.
&& ei.kingAttackersCount[them] >= 2
&& p.non_pawn_material(them) >= QueenValueMidgame + RookValueMidgame
&& ei.kingAdjacentZoneAttacksCount[them])
&& ei.kingAttackersCount[them] >= 2
&& p.non_pawn_material(them) >= QueenValueMidgame + RookValueMidgame
&& ei.kingAdjacentZoneAttacksCount[them])
{
// We have a mate, unless the queen is pinned or there
// is an X-ray attack through the queen.
{
// We have a mate, unless the queen is pinned or there
// is an X-ray attack through the queen.
{
from = p.piece_list(them, QUEEN, i);
if ( bit_is_set(p.piece_attacks<QUEEN>(from), to)
{
from = p.piece_list(them, QUEEN, i);
if ( bit_is_set(p.piece_attacks<QUEEN>(from), to)
// value if the other side has a rook or queen.
if(square_file(s) == FILE_A || square_file(s) == FILE_H) {
if(pos.non_pawn_material(them) == KnightValueMidgame
// value if the other side has a rook or queen.
if(square_file(s) == FILE_A || square_file(s) == FILE_H) {
if(pos.non_pawn_material(them) == KnightValueMidgame