ei.egMobility += Sign[us] * EgBonus[Piece][mob];
// Bishop and Knight outposts
- if ( (Piece != BISHOP && Piece != KNIGHT) // compile time condition
- || !p.square_is_weak(s, them))
- return mob;
-
- // Initial bonus based on square
- Value v, bonus;
- v = bonus = OutpostBonus[Piece][relative_square(us, s)];
-
- // Increase bonus if supported by pawn, especially if the opponent has
- // no minor piece which can exchange the outpost piece
- if (v && (p.pawn_attacks(them, s) & p.pawns(us)))
+ if ( (Piece == BISHOP || Piece == KNIGHT) // compile time condition
+ && p.square_is_weak(s, them))
{
- bonus += v / 2;
- if ( p.piece_count(them, KNIGHT) == 0
- && (SquaresByColorBB[square_color(s)] & p.bishops(them)) == EmptyBoardBB)
- bonus += v;
+ // Initial bonus based on square
+ Value v, bonus;
+ v = bonus = OutpostBonus[Piece][relative_square(us, s)];
+
+ // Increase bonus if supported by pawn, especially if the opponent has
+ // no minor piece which can exchange the outpost piece
+ if (v && (p.pawn_attacks(them, s) & p.pawns(us)))
+ {
+ bonus += v / 2;
+ if ( p.piece_count(them, KNIGHT) == 0
+ && (SquaresByColorBB[square_color(s)] & p.bishops(them)) == EmptyBoardBB)
+ bonus += v;
+ }
+ ei.mgValue += Sign[us] * bonus;
+ ei.egValue += Sign[us] * bonus;
}
- ei.mgValue += Sign[us] * bonus;
- ei.egValue += Sign[us] * bonus;
return mob;
}
// King shelter
if (relative_rank(us, s) <= RANK_4)
{
- Bitboard pawns = p.pawns(us) & this_and_neighboring_files_bb(s);
- Rank r = square_rank(s);
- for (int i = 1; i < 4; i++)
- shelter += count_1s_8bit(shiftRowsDown(pawns, r+i*sign)) * (128>>i);
-
+ // Shelter cache lookup
+ shelter = ei.pi->kingShelter(us, s);
+ if (shelter == -1)
+ {
+ shelter = 0;
+ Bitboard pawns = p.pawns(us) & this_and_neighboring_files_bb(s);
+ Rank r = square_rank(s);
+ for (int i = 1; i < 4; i++)
+ shelter += count_1s_8bit(shiftRowsDown(pawns, r+i*sign)) * (128>>i);
+
+ // Cache shelter value in pawn info
+ ei.pi->setKingShelter(us, s, shelter);
+ }
ei.mgValue += sign * Value(shelter);
}