// Initialize pawn storm scores by giving bonuses for open files
for (File f = FILE_A; f <= FILE_H; f++)
- if (pos.file_is_half_open(us, f))
+ if (Position::file_is_half_open(ourPawns, f))
{
pi->ksStormValue[us] += KStormOpenFileBonus[f];
pi->qsStormValue[us] += QStormOpenFileBonus[f];
pi->halfOpenFiles[us] &= ~(1 << f);
// Passed, isolated or doubled pawn?
- passed = pos.pawn_is_passed(us, s);
- isolated = pos.pawn_is_isolated(us, s);
- doubled = pos.pawn_is_doubled(us, s);
+ passed = Position::pawn_is_passed(theirPawns, us, s);
+ isolated = Position::pawn_is_isolated(ourPawns, s);
+ doubled = Position::pawn_is_doubled(ourPawns, us, s);
// We calculate kingside and queenside pawn storm
// scores for both colors. These are used when evaluating
// Test for candidate passed pawn
candidate = !passed
- && pos.file_is_half_open(them, f)
+ && Position::file_is_half_open(theirPawns, f)
&& ( count_1s_max_15(neighboring_files_bb(f) & (behind_bb(us, r) | rank_bb(r)) & ourPawns)
- count_1s_max_15(neighboring_files_bb(f) & in_front_bb(us, r) & theirPawns)
>= 0);
{
mv -= IsolatedPawnMidgamePenalty[f];
ev -= IsolatedPawnEndgamePenalty[f];
- if (pos.file_is_half_open(them, f))
+ if (Position::file_is_half_open(theirPawns, f))
{
mv -= IsolatedPawnMidgamePenalty[f] / 2;
ev -= IsolatedPawnEndgamePenalty[f] / 2;
{
mv -= BackwardPawnMidgamePenalty[f];
ev -= BackwardPawnEndgamePenalty[f];
- if (pos.file_is_half_open(them, f))
+ if (Position::file_is_half_open(theirPawns, f))
{
mv -= BackwardPawnMidgamePenalty[f] / 2;
ev -= BackwardPawnEndgamePenalty[f] / 2;
pi->egValue = int16_t(egValue[WHITE] - egValue[BLACK]);
return pi;
}
+
+
+/// PawnInfo::updateShelter calculates and caches king shelter. It is called
+/// only when king square changes, about 20% of total get_king_shelter() calls.
+int PawnInfo::updateShelter(const Position& pos, Color c, Square ksq) {
+
+ int shelter = 0;
+ Bitboard pawns = pos.pawns(c) & this_and_neighboring_files_bb(ksq);
+ unsigned r = ksq & (7 << 3);
+ for (int i = 1, k = (c ? -8 : 8); i < 4; i++)
+ {
+ r += k;
+ shelter += BitCount8Bit[(pawns >> r) & 0xFF] * (128 >> i);
+ }
+ kingSquares[c] = ksq;
+ kingShelters[c] = shelter;
+ return shelter;
+}