X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Fevaluate.cpp;h=4c10a199243730db00ab89a471ee4ac393b99e5a;hb=3df8cabb8483db5d843c41c54aa79544f0a09457;hp=6377faf20d0881b0c13b8b63de39b41da65a6169;hpb=759d129e4760938ded462a05061b421e18990937;p=stockfish diff --git a/src/evaluate.cpp b/src/evaluate.cpp index 6377faf2..4c10a199 100644 --- a/src/evaluate.cpp +++ b/src/evaluate.cpp @@ -258,9 +258,9 @@ namespace { // Find our pawns that are blocked or on the first two ranks Bitboard b = pos.pieces(Us, PAWN) & (shift(pos.pieces()) | LowRanks); - // Squares occupied by those pawns, by our king, or controlled by enemy pawns + // Squares occupied by those pawns, by our king or queen, or controlled by enemy pawns // are excluded from the mobility area. - mobilityArea[Us] = ~(b | pos.square(Us) | pe->pawn_attacks(Them)); + mobilityArea[Us] = ~(b | pos.pieces(Us, KING, QUEEN) | pe->pawn_attacks(Them)); // Initialise attackedBy bitboards for kings and pawns attackedBy[Us][KING] = pos.attacks_from(pos.square(Us)); @@ -301,7 +301,6 @@ namespace { Bitboard b, bb; Square s; Score score = SCORE_ZERO; - int mob; attackedBy[Us][Pt] = 0; @@ -326,8 +325,7 @@ namespace { kingAttacksCount[Us] += popcount(b & attackedBy[Them][KING]); } - mob = (Pt == KNIGHT || Pt == BISHOP) ? popcount(b & mobilityArea[Us] & ~pos.pieces(Us, QUEEN)) - : popcount(b & mobilityArea[Us]); + int mob = popcount(b & mobilityArea[Us]); mobility[Us] += MobilityBonus[Pt - 2][mob]; @@ -524,13 +522,6 @@ namespace { // Non-pawn enemies nonPawnEnemies = pos.pieces(Them) ^ pos.pieces(Them, PAWN); - // Our safe or protected pawns - b = pos.pieces(Us, PAWN) - & (~attackedBy[Them][ALL_PIECES] | attackedBy[Us][ALL_PIECES]); - - safeThreats = pawn_attacks_bb(b) & nonPawnEnemies; - score += ThreatBySafePawn * popcount(safeThreats); - // Squares strongly protected by the enemy, either because they defend the // square with a pawn, or because they defend the square twice and we don't. stronglyProtected = attackedBy[Them][PAWN] @@ -563,17 +554,30 @@ namespace { score += ThreatByRank * (int)relative_rank(Them, s); } - score += Hanging * popcount(weak & ~attackedBy[Them][ALL_PIECES]); - b = weak & attackedBy[Us][KING]; if (b) score += ThreatByKing[more_than_one(b)]; + + score += Hanging * popcount(weak & ~attackedBy[Them][ALL_PIECES]); + + // Bonus for overload (non-pawn enemies attacked and defended exactly once) + b = nonPawnEnemies + & attackedBy[Us][ALL_PIECES] & ~attackedBy2[Us] + & attackedBy[Them][ALL_PIECES] & ~attackedBy2[Them]; + score += Overload * popcount(b); } // Bonus for enemy unopposed weak pawns if (pos.pieces(Us, ROOK, QUEEN)) score += WeakUnopposedPawn * pe->weak_unopposed(Them); + // Our safe or protected pawns + b = pos.pieces(Us, PAWN) + & (~attackedBy[Them][ALL_PIECES] | attackedBy[Us][ALL_PIECES]); + + safeThreats = pawn_attacks_bb(b) & nonPawnEnemies; + score += ThreatBySafePawn * popcount(safeThreats); + // Find squares where our pawns can push on the next move b = shift(pos.pieces(Us, PAWN)) & ~pos.pieces(); b |= shift(b & TRank3BB) & ~pos.pieces(); @@ -609,12 +613,6 @@ namespace { b = (pos.pieces(Us) ^ pos.pieces(Us, PAWN, KING)) & attackedBy[Us][ALL_PIECES]; score += Connectivity * popcount(b); - // Bonus for overload (non-pawn enemies attacked and defended exactly once) - b = nonPawnEnemies - & attackedBy[Us][ALL_PIECES] & ~attackedBy2[Us] - & attackedBy[Them][ALL_PIECES] & ~attackedBy2[Them]; - score += Overload * popcount(b); - if (T) Trace::add(THREAT, Us, score); @@ -700,7 +698,7 @@ namespace { } // w != 0 // Scale down bonus for candidate passers which need more than one - // pawn push to become passed or have a pawn in front of them. + // pawn push to become passed, or have a pawn in front of them. if ( !pos.pawn_passed(Us, s + Up) || (pos.pieces(PAWN) & forward_file_bb(Us, s))) bonus = bonus / 2; @@ -733,13 +731,10 @@ namespace { if (pos.non_pawn_material() < SpaceThreshold) return SCORE_ZERO; - // Find the safe squares for our pieces inside the area defined by - // SpaceMask. A square is unsafe if it is attacked by an enemy - // pawn, or if it is undefended and attacked by an enemy piece. + // Find the available squares for our pieces inside the area defined by SpaceMask Bitboard safe = SpaceMask & ~pos.pieces(Us, PAWN) - & ~attackedBy[Them][PAWN] - & (attackedBy[Us][ALL_PIECES] | ~attackedBy[Them][ALL_PIECES]); + & ~attackedBy[Them][PAWN]; // Find all squares which are at most three squares behind some friendly pawn Bitboard behind = pos.pieces(Us, PAWN);