// all squares attacked by the given color.
Bitboard attackedBy[2][8];
- // kingZone[color] is the zone around the enemy king which is considered
+ // kingRing[color] is the zone around the king which is considered
// by the king safety evaluation. This consists of the squares directly
// adjacent to the king, and the three (or two, for a king on an edge file)
// squares two ranks in front of the king. For instance, if black's king
- // is on g8, kingZone[WHITE] is a bitboard containing the squares f8, h8,
+ // is on g8, kingRing[BLACK] is a bitboard containing the squares f8, h8,
// f7, g7, h7, f6, g6 and h6.
- Bitboard kingZone[2];
+ Bitboard kingRing[2];
// kingAttackersCount[color] is the number of pieces of the given color
- // which attack a square in the kingZone of the enemy king.
+ // which attack a square in the kingRing of the enemy king.
int kingAttackersCount[2];
// kingAttackersWeight[color] is the sum of the "weight" of the pieces of the
- // given color which attack a square in the kingZone of the enemy king. The
+ // given color which attack a square in the kingRing of the enemy king. The
// weights of the individual piece types are given by the variables
// QueenAttackWeight, RookAttackWeight, BishopAttackWeight and
// KnightAttackWeight in evaluate.cpp
{ S(0, 0), S(15, 39), S(15, 39), S(15, 39), S(15, 39), S( 0, 0) } // QUEEN
};
- // ThreatedByPawnPenalty[PieceType] contains a penalty according to which
+ // ThreatenedByPawnPenalty[PieceType] contains a penalty according to which
// piece type is attacked by an enemy pawn.
- const Score ThreatedByPawnPenalty[] = {
+ const Score ThreatenedByPawnPenalty[] = {
S(0, 0), S(0, 0), S(56, 70), S(56, 70), S(76, 99), S(86, 118)
};
Value margins[2];
Score score, mobilityWhite, mobilityBlack;
- assert(pos.is_ok());
assert(pos.thread() >= 0 && pos.thread() < MAX_THREADS);
assert(!pos.in_check());
if ( pos.piece_count(Us, QUEEN)
&& pos.non_pawn_material(Us) >= QueenValueMidgame + RookValueMidgame)
{
- ei.kingZone[Us] = (b | (Us == WHITE ? b >> 8 : b << 8));
+ ei.kingRing[Them] = (b | (Us == WHITE ? b >> 8 : b << 8));
b &= ei.attackedBy[Us][PAWN];
ei.kingAttackersCount[Us] = b ? count_1s<Max15>(b) / 2 : 0;
ei.kingAdjacentZoneAttacksCount[Us] = ei.kingAttackersWeight[Us] = 0;
} else
- ei.kingZone[Us] = ei.kingAttackersCount[Us] = 0;
+ ei.kingRing[Them] = ei.kingAttackersCount[Us] = 0;
}
const BitCountType Full = HasPopCnt ? CNT_POPCNT : CpuIs64Bit ? CNT64 : CNT32;
const BitCountType Max15 = HasPopCnt ? CNT_POPCNT : CpuIs64Bit ? CNT64_MAX15 : CNT32_MAX15;
const Color Them = (Us == WHITE ? BLACK : WHITE);
- const Square* ptr = pos.piece_list_begin(Us, Piece);
+ const Square* pl = pos.piece_list(Us, Piece);
ei.attackedBy[Us][Piece] = EmptyBoardBB;
- while ((s = *ptr++) != SQ_NONE)
+ while ((s = *pl++) != SQ_NONE)
{
// Find attacked squares, including x-ray attacks for bishops and rooks
if (Piece == KNIGHT || Piece == QUEEN)
ei.attackedBy[Us][Piece] |= b;
// King attacks
- if (b & ei.kingZone[Us])
+ if (b & ei.kingRing[Them])
{
ei.kingAttackersCount[Us]++;
ei.kingAttackersWeight[Us] += KingAttackWeights[Piece];
// Decrease score if we are attacked by an enemy pawn. Remaining part
// of threat evaluation must be done later when we have full attack info.
if (bit_is_set(ei.attackedBy[Them][PAWN], s))
- score -= ThreatedByPawnPenalty[Piece];
+ score -= ThreatenedByPawnPenalty[Piece];
// Bishop and knight outposts squares
- if ((Piece == BISHOP || Piece == KNIGHT) && pos.square_is_weak(s, Us))
+ if ( (Piece == BISHOP || Piece == KNIGHT)
+ && !(pos.pieces(PAWN, Them) & attack_span_mask(Us, s)))
score += evaluate_outposts<Piece, Us>(pos, ei, s);
// Queen or rook on 7th rank
Score score = SCORE_ZERO;
// Enemy pieces not defended by a pawn and under our attack
- Bitboard weakEnemies = pos.pieces_of_color(Them)
+ Bitboard weakEnemies = pos.pieces(Them)
& ~ei.attackedBy[Them][PAWN]
& ei.attackedBy[Us][0];
if (!weakEnemies)
Score score = mobility = SCORE_ZERO;
// Do not include in mobility squares protected by enemy pawns or occupied by our pieces
- const Bitboard mobilityArea = ~(ei.attackedBy[Them][PAWN] | pos.pieces_of_color(Us));
+ const Bitboard mobilityArea = ~(ei.attackedBy[Them][PAWN] | pos.pieces(Us));
score += evaluate_pieces<KNIGHT, Us, HasPopCnt, Trace>(pos, ei, mobility, mobilityArea);
score += evaluate_pieces<BISHOP, Us, HasPopCnt, Trace>(pos, ei, mobility, mobilityArea);
// Analyse enemy's safe queen contact checks. First find undefended
// squares around the king attacked by enemy queen...
- b = undefended & ei.attackedBy[Them][QUEEN] & ~pos.pieces_of_color(Them);
+ b = undefended & ei.attackedBy[Them][QUEEN] & ~pos.pieces(Them);
if (b)
{
// ...then remove squares not supported by another enemy piece
// Analyse enemy's safe rook contact checks. First find undefended
// squares around the king attacked by enemy rooks...
- b = undefended & ei.attackedBy[Them][ROOK] & ~pos.pieces_of_color(Them);
+ b = undefended & ei.attackedBy[Them][ROOK] & ~pos.pieces(Them);
// Consider only squares where the enemy rook gives check
b &= RookPseudoAttacks[ksq];
}
// Analyse enemy's safe distance checks for sliders and knights
- safe = ~(pos.pieces_of_color(Them) | ei.attackedBy[Us][0]);
+ safe = ~(pos.pieces(Them) | ei.attackedBy[Us][0]);
b1 = pos.attacks_from<ROOK>(ksq) & safe;
b2 = pos.attacks_from<BISHOP>(ksq) & safe;
&& (squares_in_front_of(Them, s) & pos.pieces(ROOK, QUEEN, Them) & pos.attacks_from<ROOK>(s)))
unsafeSquares = squaresToQueen;
else
- unsafeSquares = squaresToQueen & (ei.attackedBy[Them][0] | pos.pieces_of_color(Them));
+ unsafeSquares = squaresToQueen & (ei.attackedBy[Them][0] | pos.pieces(Them));
// If there aren't enemy attacks or pieces along the path to queen give
// huge bonus. Even bigger if we protect the pawn's path.
// At last, add a small bonus when there are no *friendly* pieces
// in the pawn's path.
- if (!(squaresToQueen & pos.pieces_of_color(Us)))
+ if (!(squaresToQueen & pos.pieces(Us)))
ebonus += Value(rr);
}
} // rr != 0
// Opponent king cannot block because path is defended and position
// is not in check. So only friendly pieces can be blockers.
assert(!pos.in_check());
- assert(queeningPath & pos.occupied_squares() == queeningPath & pos.pieces_of_color(c));
+ assert((queeningPath & pos.occupied_squares()) == (queeningPath & pos.pieces(c)));
// Add moves needed to free the path from friendly pieces and retest condition
- movesToGo += count_1s<Max15>(queeningPath & pos.pieces_of_color(c));
+ movesToGo += count_1s<Max15>(queeningPath & pos.pieces(c));
if (movesToGo >= oppMovesToGo && !pathDefended)
continue;