+ bool passed = Position::pawn_is_passed(theirPawns, us, s);
+ bool isolated = Position::pawn_is_isolated(ourPawns, s);
+ bool doubled = Position::pawn_is_doubled(ourPawns, us, s);
+
+ // We calculate kingside and queenside pawn storm
+ // scores for both colors. These are used when evaluating
+ // middle game positions with opposite side castling.
+ //
+ // Each pawn is given a base score given by a piece square table
+ // (KStormTable[] or QStormTable[]). Pawns which seem to have good
+ // chances of creating an open file by exchanging itself against an
+ // enemy pawn on an adjacent file gets an additional bonus.
+
+ // Kingside pawn storms
+ int bonus = KStormTable[relative_square(us, s)];
+ if (f >= FILE_F)
+ {
+ Bitboard b = outpost_mask(us, s) & theirPawns & (FileFBB | FileGBB | FileHBB);
+ while (b)
+ {
+ Square s2 = pop_1st_bit(&b);
+ if (!(theirPawns & neighboring_files_bb(s2) & rank_bb(s2)))
+ {
+ // The enemy pawn has no pawn beside itself, which makes it
+ // particularly vulnerable. Big bonus, especially against a
+ // weakness on the rook file.
+ if (square_file(s2) == FILE_H)
+ bonus += 4*StormLeverBonus[f] - 8*square_distance(s, s2);
+ else
+ bonus += 2*StormLeverBonus[f] - 4*square_distance(s, s2);
+ } else
+ // There is at least one enemy pawn beside the enemy pawn we look
+ // at, which means that the pawn has somewhat better chances of
+ // defending itself by advancing. Smaller bonus.
+ bonus += StormLeverBonus[f] - 2*square_distance(s, s2);
+ }
+ }
+ pi->ksStormValue[us] += bonus;