From 87fc9dcaa30017dcfd886b0f304a76a63dedc35e Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Sun, 8 Jan 2012 12:08:16 +0100 Subject: [PATCH] Add castling to generation of checking moves During generation of non-captures checks (in qsearch) we don't consider castling moves that give check, this patch includes also this rare case. Verified with perft that all the non-capture checks are now generated. There should be a very little slowdown due to the extra work, but actually I failed to measure it. I don't expect any ELO improvment, there is even no functional change on the standard depth 12 search, it is just to have a correct move generator. Signed-off-by: Marco Costalba --- src/movegen.cpp | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) 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; } -- 2.39.2