]> git.sesse.net Git - stockfish/blobdiff - src/pawns.cpp
Retire Position::pawn_is_passed() and friends
[stockfish] / src / pawns.cpp
index 58f93713bf80080ab526668d5d9fd93e16415957..2459a6b05ea09ab170c9e857324078bf807912b1 100644 (file)
@@ -1,7 +1,7 @@
 /*
   Stockfish, a UCI chess playing engine derived from Glaurung 2.1
   Copyright (C) 2004-2008 Tord Romstad (Glaurung author)
-  Copyright (C) 2008-2009 Marco Costalba
+  Copyright (C) 2008-2010 Marco Costalba, Joona Kiiski, Tord Romstad
 
   Stockfish is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
@@ -206,9 +206,9 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns,
       assert(pos.piece_on(s) == piece_of_color_and_type(Us, PAWN));
 
       // Passed, isolated or doubled pawn?
-      passed   = Position::pawn_is_passed(theirPawns, Us, s);
-      isolated = Position::pawn_is_isolated(ourPawns, s);
-      doubled  = Position::pawn_is_doubled(ourPawns, Us, s);
+      passed   = !(theirPawns & passed_pawn_mask(Us, s));
+      isolated = !(ourPawns & neighboring_files_bb(s));
+      doubled  = ourPawns & squares_behind(Us, s);
 
       // We calculate kingside and queenside pawn storm
       // scores for both colors. These are used when evaluating
@@ -226,21 +226,16 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns,
           Bitboard b = outpost_mask(Us, s) & theirPawns & (FileFBB | FileGBB | FileHBB);
           while (b)
           {
+              // Give a bonus according to the distance of the nearest enemy pawn
               Square s2 = pop_1st_bit(&b);
+              int v = StormLeverBonus[f] - 2 * square_distance(s, s2);
+
+              // If enemy pawn has no pawn beside itself is particularly vulnerable.
+              // Big bonus, especially against a weakness on the rook file
               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);
+                  v *= (square_file(s2) == FILE_H ? 4 : 2);
+
+              bonus += v;
           }
       }
       pi->ksStormValue[Us] += bonus;
@@ -252,21 +247,16 @@ Score PawnInfoTable::evaluate_pawns(const Position& pos, Bitboard ourPawns,
           Bitboard b = outpost_mask(Us, s) & theirPawns & (FileABB | FileBBB | FileCBB);
           while (b)
           {
+              // Give a bonus according to the distance of the nearest enemy pawn
               Square s2 = pop_1st_bit(&b);
+              int v = StormLeverBonus[f] - 4 * square_distance(s, s2);
+
+              // If enemy pawn has no pawn beside itself is particularly vulnerable.
+              // Big bonus, especially against a weakness on the rook file
               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_A)
-                      bonus += 4*StormLeverBonus[f] - 16*square_distance(s, s2);
-                  else
-                      bonus += 2*StormLeverBonus[f] - 8*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] - 4*square_distance(s, s2);
+                  v *= (square_file(s2) == FILE_A ? 4 : 2);
+
+              bonus += v;
           }
       }
       pi->qsStormValue[Us] += bonus;