const Square Right = (Us == WHITE ? DELTA_NE : DELTA_SW);
const Square Left = (Us == WHITE ? DELTA_NW : DELTA_SE);
- Bitboard b, p, doubled, connected, supported;
+ Bitboard b, neighbours, doubled, supported, phalanx;
Square s;
- bool passed, isolated, opposed, phalanx, backward, lever;
+ bool passed, isolated, opposed, backward, lever, connected;
Score score = SCORE_ZERO;
const Square* pl = pos.list<PAWN>(Us);
const Bitboard* pawnAttacksBB = StepAttacksBB[make_piece(Us, PAWN)];
// This file cannot be semi-open
e->semiopenFiles[Us] &= ~(1 << f);
- // Previous rank
- p = rank_bb(s - Up);
-
// Flag the pawn
- connected = ourPawns & adjacent_files_bb(f) & (rank_bb(s) | p);
- phalanx = connected & rank_bb(s);
- supported = connected & p;
- isolated = !(ourPawns & adjacent_files_bb(f));
+ neighbours = ourPawns & adjacent_files_bb(f);
doubled = ourPawns & forward_bb(Us, s);
opposed = theirPawns & forward_bb(Us, s);
passed = !(theirPawns & passed_pawn_mask(Us, s));
lever = theirPawns & pawnAttacksBB[s];
+ phalanx = neighbours & rank_bb(s);
+ supported = neighbours & rank_bb(s - Up);
+ connected = supported | phalanx;
+ isolated = !neighbours;
// Test for backward pawn.
// If the pawn is passed, isolated, lever or connected it cannot be
score -= Backward[opposed][f];
if (connected)
- score += Connected[opposed][phalanx][more_than_one(supported)][relative_rank(Us, s)];
+ score += Connected[opposed][!!phalanx][more_than_one(supported)][relative_rank(Us, s)];
if (lever)
score += Lever[relative_rank(Us, s)];
kingSquares[Us] = ksq;
castlingRights[Us] = pos.can_castle(Us);
- minKingPawnDistance[Us] = 0;
+ int minKingPawnDistance = 0;
Bitboard pawns = pos.pieces(Us, PAWN);
if (pawns)
- while (!(DistanceRingBB[ksq][minKingPawnDistance[Us]++] & pawns)) {}
+ while (!(DistanceRingBB[ksq][minKingPawnDistance++] & pawns)) {}
if (relative_rank(Us, ksq) > RANK_4)
- return make_score(0, -16 * minKingPawnDistance[Us]);
+ return make_score(0, -16 * minKingPawnDistance);
Value bonus = shelter_storm<Us>(pos, ksq);
if (pos.can_castle(MakeCastling<Us, QUEEN_SIDE>::right))
bonus = std::max(bonus, shelter_storm<Us>(pos, relative_square(Us, SQ_C1)));
- return make_score(bonus, -16 * minKingPawnDistance[Us]);
+ return make_score(bonus, -16 * minKingPawnDistance);
}
// Explicit template instantiation