X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmovegen.cpp;h=287b1c0dd6d98e54b0aa227d4d5b6b8a915b7436;hp=0f2f6b4e0fd37d94187eeb05cfde1d6179e1b412;hb=5c81602d14539f8259a715477315e28b5de7cb54;hpb=e7f03913eaa10454850f79f2e54826af7d9ebb70 diff --git a/src/movegen.cpp b/src/movegen.cpp index 0f2f6b4e..287b1c0d 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -1,6 +1,7 @@ /* Stockfish, a UCI chess playing engine derived from Glaurung 2.1 - Copyright (C) 2004-2008 Tord Romstad (Glaurung author) Copyright (C) 2008 Marco Costalba + Copyright (C) 2004-2008 Tord Romstad (Glaurung author) + Copyright (C) 2008-2009 Marco Costalba Stockfish is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -73,9 +74,8 @@ namespace { return Us == WHITE ? p << 9 : p >> 7; else if (Direction == DELTA_NW) return Us == WHITE ? p << 7 : p >> 9; - - assert(false); - return p; + else + return p; } // Template generate_piece_checks() with specializations @@ -177,10 +177,10 @@ int generate_noncaptures(const Position& pos, MoveStack* mlist) { } -/// generate_checks() generates all pseudo-legal non-capturing, non-promoting -/// checks. It returns the number of generated moves. +/// generate_non_capture_checks() generates all pseudo-legal non-capturing, +/// non-promoting checks. It returns the number of generated moves. -int generate_checks(const Position& pos, MoveStack* mlist, Bitboard dc) { +int generate_non_capture_checks(const Position& pos, MoveStack* mlist, Bitboard dc) { assert(pos.is_ok()); assert(!pos.is_check()); @@ -497,6 +497,11 @@ bool move_is_legal(const Position& pos, const Move m, Bitboard pinned) { // Proceed according to the type of the moving piece. if (type_of_piece(pc) == PAWN) { + // Move direction must be compatible with pawn color + int direction = to - from; + if ((us == WHITE) != (direction > 0)) + return false; + // If the destination square is on the 8/1th rank, the move must // be a promotion. if ( ( (square_rank(to) == RANK_8 && us == WHITE) @@ -506,7 +511,7 @@ bool move_is_legal(const Position& pos, const Move m, Bitboard pinned) { // Proceed according to the square delta between the source and // destionation squares. - switch (to - from) + switch (direction) { case DELTA_NW: case DELTA_NE: @@ -815,9 +820,17 @@ namespace { return mlist; Bitboard checkSqs = pos.piece_attacks(ksq) & pos.empty_squares(); + if (!checkSqs) + return mlist; + while (b) { Square from = pop_1st_bit(&b); + if ( (Piece == QUEEN && !(QueenPseudoAttacks[from] & checkSqs)) + || (Piece == ROOK && !(RookPseudoAttacks[from] & checkSqs)) + || (Piece == BISHOP && !(BishopPseudoAttacks[from] & checkSqs))) + continue; + Bitboard bb = pos.piece_attacks(from) & checkSqs; SERIALIZE_MOVES(bb); }