X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fendgame.cpp;h=5958e633d90e271e9fef852014defd7d6000164b;hb=6373fd56e90bc6114230a70cacad804248d955e2;hp=835173c468b68bed46b7159dfafe5e32d74c9b0a;hpb=eb6d7f537d214c4dc8bde7d4fdc2aaead47dd3c3;p=stockfish
diff --git a/src/endgame.cpp b/src/endgame.cpp
index 835173c4..5958e633 100644
--- a/src/endgame.cpp
+++ b/src/endgame.cpp
@@ -18,7 +18,6 @@
along with this program. If not, see .
*/
-#include
#include
#include "bitboard.h"
@@ -77,10 +76,7 @@ namespace {
if (file_of(pos.square(strongSide)) >= FILE_E)
sq = Square(sq ^ 7); // Mirror SQ_H1 -> SQ_A1
- if (strongSide == BLACK)
- sq = ~sq;
-
- return sq;
+ return strongSide == WHITE ? sq : ~sq;
}
} // namespace
@@ -286,6 +282,21 @@ Value Endgame::operator()(const Position& pos) const {
}
+/// KNN vs KP. Simply push the opposing king to the corner
+template<>
+Value Endgame::operator()(const Position& pos) const {
+
+ assert(verify_material(pos, strongSide, 2 * KnightValueMg, 0));
+ assert(verify_material(pos, weakSide, VALUE_ZERO, 1));
+
+ Value result = 2 * KnightValueEg
+ - PawnValueEg
+ + PushToEdges[pos.square(weakSide)];
+
+ return strongSide == pos.side_to_move() ? result : -result;
+}
+
+
/// Some cases of trivial draws
template<> Value Endgame::operator()(const Position&) const { return VALUE_DRAW; }
@@ -624,8 +635,6 @@ ScaleFactor Endgame::operator()(const Position& pos) const {
Square ksq = pos.square(weakSide);
Square psq1 = pos.squares(strongSide)[0];
Square psq2 = pos.squares(strongSide)[1];
- Rank r1 = rank_of(psq1);
- Rank r2 = rank_of(psq2);
Square blockSq1, blockSq2;
if (relative_rank(strongSide, psq1) > relative_rank(strongSide, psq2))
@@ -659,7 +668,7 @@ ScaleFactor Endgame::operator()(const Position& pos) const {
&& opposite_colors(ksq, wbsq)
&& ( bbsq == blockSq2
|| (pos.attacks_from(blockSq2) & pos.pieces(weakSide, BISHOP))
- || distance(r1, r2) >= 2))
+ || distance(psq1, psq2) >= 2))
return SCALE_FACTOR_DRAW;
else if ( ksq == blockSq2