Endgames::Endgames() {
- add<KK>("KK");
add<KPK>("KPK");
- add<KBK>("KBK");
- add<KNK>("KNK");
add<KNNK>("KNNK");
add<KBNK>("KBNK");
add<KRKP>("KRKP");
assert(pos.non_pawn_material(weakerSide) == VALUE_ZERO);
assert(!pos.count<PAWN>(weakerSide));
+ assert(!pos.checkers()); // Eval is never called when in check
// Stalemate detection with lone king
- if ( pos.side_to_move() == weakerSide
- && !pos.checkers()
- && !MoveList<LEGAL>(pos).size()) {
- return VALUE_DRAW;
- }
+ if (pos.side_to_move() == weakerSide && !MoveList<LEGAL>(pos).size())
+ return VALUE_DRAW;
Square winnerKSq = pos.king_square(strongerSide);
Square loserKSq = pos.king_square(weakerSide);
if ( pos.count<QUEEN>(strongerSide)
|| pos.count<ROOK>(strongerSide)
- || pos.bishop_pair(strongerSide)) {
- result += VALUE_KNOWN_WIN;
- }
+ || pos.bishop_pair(strongerSide))
+ result += VALUE_KNOWN_WIN;
return strongerSide == pos.side_to_move() ? result : -result;
}
/// Some cases of trivial draws
-template<> Value Endgame<KK>::operator()(const Position&) const { return VALUE_DRAW; }
-template<> Value Endgame<KBK>::operator()(const Position&) const { return VALUE_DRAW; }
-template<> Value Endgame<KNK>::operator()(const Position&) const { return VALUE_DRAW; }
template<> Value Endgame<KNNK>::operator()(const Position&) const { return VALUE_DRAW; }
template<> Value Endgame<KmmKm>::operator()(const Position&) const { return VALUE_DRAW; }