diff --git a/src/movegen.cpp b/src/movegen.cpp index 272807b9..1820fee2 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -34,7 +34,7 @@ namespace { enum CastlingSide { KING_SIDE, QUEEN_SIDE }; - template + template MoveStack* generate_castle_moves(const Position& pos, MoveStack* mlist, Color us) { const CastleRight CR[] = { Side ? WHITE_OOO : WHITE_OO, @@ -81,6 +81,9 @@ namespace { (*mlist++).move = make_castle(kfrom, rfrom); + if (OnlyChecks && !pos.move_gives_check((mlist - 1)->move, CheckInfo(pos))) + mlist--; + return mlist; } @@ -360,8 +363,8 @@ MoveStack* generate(const Position& pos, MoveStack* mlist) { if (Type != MV_CAPTURE && pos.can_castle(us)) { - mlist = generate_castle_moves(pos, mlist, us); - mlist = generate_castle_moves(pos, mlist, us); + mlist = generate_castle_moves(pos, mlist, us); + mlist = generate_castle_moves(pos, mlist, us); } return mlist; @@ -410,7 +413,15 @@ MoveStack* generate(const Position& pos, MoveStack* mlist) mlist = generate_direct_checks(pos, mlist, us, dc, ksq); mlist = generate_direct_checks(pos, mlist, us, dc, ksq); mlist = generate_direct_checks(pos, mlist, us, dc, ksq); - return generate_direct_checks(pos, mlist, us, dc, ksq); + mlist = generate_direct_checks(pos, mlist, us, dc, ksq); + + if (pos.can_castle(us)) + { + mlist = generate_castle_moves(pos, mlist, us); + mlist = generate_castle_moves(pos, mlist, us); + } + + return mlist; }