const Score Hanging = S(48, 27);
const Score ThreatByPawnPush = S(38, 22);
const Score Unstoppable = S( 0, 20);
+ const Score PawnlessFlank = S(20, 80);
+ const Score HinderPassedPawn = S( 7, 0);
+ const Score ThreatByRank = S(16, 3);
// Penalty for a bishop on a1/h1 (a8/h8 for black) which is trapped by
// a friendly pawn on b2/g2 (b7/g7 for black). This can obviously only
}
// King tropism: firstly, find squares that opponent attacks in our king flank
- b = ei.attackedBy[Them][ALL_PIECES] & KingFlank[Us][file_of(ksq)];
+ File kf = file_of(ksq);
+ b = ei.attackedBy[Them][ALL_PIECES] & KingFlank[Us][kf];
assert(((Us == WHITE ? b << 4 : b >> 4) & b) == 0);
assert(popcount(Us == WHITE ? b << 4 : b >> 4) == popcount(b));
score -= CloseEnemies * popcount(b);
+ // Penalty when our king is on a pawnless flank
+ if (!(pos.pieces(PAWN) & (KingFlank[WHITE][kf] | KingFlank[BLACK][kf])))
+ score -= PawnlessFlank;
+
if (DoTrace)
Trace::add(KING, Us, score);
{
b = (defended | weak) & (ei.attackedBy[Us][KNIGHT] | ei.attackedBy[Us][BISHOP]);
while (b)
- score += Threat[Minor][type_of(pos.piece_on(pop_lsb(&b)))];
+ {
+ Square s = pop_lsb(&b);
+ score += Threat[Minor][type_of(pos.piece_on(s))];
+ if (type_of(pos.piece_on(s)) != PAWN)
+ score += ThreatByRank * (int)relative_rank(Them, s);
+ }
b = (pos.pieces(Them, QUEEN) | weak) & ei.attackedBy[Us][ROOK];
while (b)
- score += Threat[Rook ][type_of(pos.piece_on(pop_lsb(&b)))];
+ {
+ Square s = pop_lsb(&b);
+ score += Threat[Rook][type_of(pos.piece_on(s))];
+ if (type_of(pos.piece_on(s)) != PAWN)
+ score += ThreatByRank * (int)relative_rank(Them, s);
+ }
score += Hanging * popcount(weak & ~ei.attackedBy[Them][ALL_PIECES]);
const Color Them = (Us == WHITE ? BLACK : WHITE);
- Bitboard b, squaresToQueen, defendedSquares, unsafeSquares;
+ Bitboard b, bb, squaresToQueen, defendedSquares, unsafeSquares;
Score score = SCORE_ZERO;
b = ei.pi->passed_pawns(Us);
assert(pos.pawn_passed(Us, s));
assert(!(pos.pieces(PAWN) & forward_bb(Us, s)));
+ bb = forward_bb(Us, s) & (ei.attackedBy[Them][ALL_PIECES] | pos.pieces(Them));
+ score -= HinderPassedPawn * popcount(bb);
+
int r = relative_rank(Us, s) - RANK_2;
int rr = r * (r - 1);
// in the pawn's path attacked or occupied by the enemy.
defendedSquares = unsafeSquares = squaresToQueen = forward_bb(Us, s);
- Bitboard bb = forward_bb(Them, s) & pos.pieces(ROOK, QUEEN) & pos.attacks_from<ROOK>(s);
+ bb = forward_bb(Them, s) & pos.pieces(ROOK, QUEEN) & pos.attacks_from<ROOK>(s);
if (!(pos.pieces(Us) & bb))
defendedSquares &= ei.attackedBy[Us][ALL_PIECES];
Trace::add(IMBALANCE, ei.me->imbalance());
Trace::add(PAWN, ei.pi->pawns_score());
Trace::add(MOBILITY, mobility[WHITE], mobility[BLACK]);
- Trace::add(SPACE, evaluate_space<WHITE>(pos, ei)
- , evaluate_space<BLACK>(pos, ei));
+ if (pos.non_pawn_material(WHITE) + pos.non_pawn_material(BLACK) >= 12222)
+ Trace::add(SPACE, evaluate_space<WHITE>(pos, ei)
+ , evaluate_space<BLACK>(pos, ei));
Trace::add(TOTAL, score);
}