// Potential piece flips
if (pos.flip_enclosed_pieces())
{
- // Stable
- Bitboard corners = pos.pieces(Us) & (FileABB | file_bb(pos.max_file())) & (Rank1BB | rank_bb(pos.max_rank()));
+ // Stable pieces
+ Bitboard edges = (FileABB | file_bb(pos.max_file()) | Rank1BB | rank_bb(pos.max_rank())) & pos.board_bb();
+ Bitboard edgePieces = pos.pieces(Us) & edges;
Bitboard stable = 0;
- while (corners)
- stable |= attacks_bb(Us, ROOK, pop_lsb(&corners), ~pos.pieces(~Us)) & pos.pieces(Us);
+ while (edgePieces)
+ {
+ Square s = pop_lsb(&edgePieces);
+ Bitboard connectedEdge = attacks_bb(Us, ROOK, s, ~(pos.pieces() & edges)) & edges;
+ if (!(connectedEdge & ~pos.pieces()) || !more_than_one(connectedEdge & ~pos.pieces(Us)))
+ stable |= s;
+ }
score += make_score(300, 300) * popcount(stable);
// Unstable