/// Constructors
-Position::Position(const Position &pos) {
+Position::Position(const Position& pos) {
copy(pos);
}
-Position::Position(const std::string &fen) {
+Position::Position(const std::string& fen) {
from_fen(fen);
}
/// string. This function is not very robust - make sure that input FENs are
/// correct (this is assumed to be the responsibility of the GUI).
-void Position::from_fen(const std::string &fen) {
+void Position::from_fen(const std::string& fen) {
static const std::string pieceLetters = "KQRBNPkqrbnp";
static const Piece pieces[] = { WK, WQ, WR, WB, WN, WP, BK, BQ, BR, BB, BN, BP };
// Find all attackers to the destination square, with the moving piece
// removed, but possibly an X-ray attacker added behind it.
occ = occupied_squares();
+
+ // Handle enpassant moves
+ if (ep_square() == to && type_of_piece_on(from) == PAWN)
+ {
+ assert(capture == EMPTY);
+
+ Square capQq = (side_to_move() == WHITE)? (to - DELTA_N) : (to - DELTA_S);
+ capture = piece_on(capQq);
+
+ assert(type_of_piece_on(capQq) == PAWN);
+
+ // Remove the captured pawn
+ clear_bit(&occ, capQq);
+ }
+
while (true)
{
clear_bit(&occ, from);
/// side to move is checkmated. Note that this function is currently very
/// slow, and shouldn't be used frequently inside the search.
-bool Position::is_mate() {
+bool Position::is_mate() const {
if (is_check())
{