- // 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
- 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;
+ bonus = (f <= FILE_C ? evaluate_pawn_storm<Us, QueenSide>(s, r, f, theirPawns) : 0);
+ pi->qsStormValue[Us] += QStormTable[relative_square(Us, s)] + bonus;