X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmovegen.cpp;h=ea3255cc3c8c91e7f309f360f12a119f3707c747;hp=ea58740f59ccadb3e9a71c5702831f7ef53a8b93;hb=d9dc9dbd65263f8644afcc1fc632e9201ad20c70;hpb=9fc602bae74b8e09bd45ace3b42a8ce84d56b23c diff --git a/src/movegen.cpp b/src/movegen.cpp index ea58740f..ea3255cc 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -140,6 +140,32 @@ MoveStack* generate_noncaptures(const Position& pos, MoveStack* mlist) { } +/// generate_non_evasions() generates all pseudo-legal captures and +/// non-captures. Returns a pointer to the end of the move list. + +MoveStack* generate_non_evasions(const Position& pos, MoveStack* mlist) { + + assert(pos.is_ok()); + assert(!pos.is_check()); + + Color us = pos.side_to_move(); + Bitboard target = pos.pieces_of_color(opposite_color(us)); + + mlist = generate_piece_moves(pos, mlist, us, target); + mlist = generate_piece_moves(pos, mlist, us, pos.empty_squares()); + + target |= pos.empty_squares(); + + mlist = generate_piece_moves(pos, mlist, us, target); + mlist = generate_piece_moves(pos, mlist, us, target); + mlist = generate_piece_moves(pos, mlist, us, target); + mlist = generate_piece_moves(pos, mlist, us, target); + mlist = generate_piece_moves(pos, mlist, us, target); + mlist = generate_castle_moves(pos, mlist); + return generate_castle_moves(pos, mlist); +} + + /// generate_non_capture_checks() generates all pseudo-legal non-captures and knight /// underpromotions that give check. Returns a pointer to the end of the move list. @@ -260,11 +286,8 @@ MoveStack* generate_moves(const Position& pos, MoveStack* mlist, bool pseudoLega Bitboard pinned = pos.pinned_pieces(pos.side_to_move()); // Generate pseudo-legal moves - if (pos.is_check()) - last = generate_evasions(pos, mlist); - else - last = generate_noncaptures(pos, generate_captures(pos, mlist)); - + last = pos.is_check() ? generate_evasions(pos, mlist) + : generate_non_evasions(pos, mlist); if (pseudoLegal) return last; @@ -338,6 +361,10 @@ bool move_is_legal(const Position& pos, const Move m, Bitboard pinned) { ||(square_rank(to) == RANK_1 && us != WHITE)) != bool(move_is_promotion(m))) return false; + // The promotion piece, if any, must be valid + if (move_promotion_piece(m) > QUEEN || move_promotion_piece(m) == PAWN) + return false; + // Proceed according to the square delta between the origin and // destination squares. switch (direction) @@ -402,10 +429,13 @@ namespace { Square from; const Square* ptr = pos.piece_list_begin(us, Piece); - while ((from = *ptr++) != SQ_NONE) + if (*ptr != SQ_NONE) { - b = pos.attacks_from(from) & target; - SERIALIZE_MOVES(b); + do { + from = *ptr; + b = pos.attacks_from(from) & target; + SERIALIZE_MOVES(b); + } while (*++ptr != SQ_NONE); } return mlist; }