X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fmovegen.cpp;h=76a27d9f4936320165c0378f2b59225038b0abbe;hp=35ca6e770293459e36b1bb2bd0c7924f79922a7b;hb=59d32f8eddf4fc8138f419777fbabf58080f1caa;hpb=ed26d71354c3ab1a1419975430258b6e961787a7 diff --git a/src/movegen.cpp b/src/movegen.cpp index 35ca6e77..76a27d9f 100644 --- a/src/movegen.cpp +++ b/src/movegen.cpp @@ -2,7 +2,7 @@ Stockfish, a UCI chess playing engine derived from Glaurung 2.1 Copyright (C) 2004-2008 Tord Romstad (Glaurung author) Copyright (C) 2008-2015 Marco Costalba, Joona Kiiski, Tord Romstad - Copyright (C) 2015-2018 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad + Copyright (C) 2015-2019 Marco Costalba, Joona Kiiski, Gary Linscott, Tord Romstad Stockfish is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -25,20 +25,21 @@ namespace { - template - ExtMove* generate_castling(const Position& pos, ExtMove* moveList, Color us) { + template + ExtMove* generate_castling(const Position& pos, ExtMove* moveList) { - constexpr bool KingSide = (Cr == WHITE_OO || Cr == BLACK_OO); + constexpr CastlingRight Cr = Us | Cs; + constexpr bool KingSide = (Cs == KING_SIDE); if (pos.castling_impeded(Cr) || !pos.can_castle(Cr)) return moveList; // After castling, the rook and king final positions are the same in Chess960 // as they would be in standard chess. - Square kfrom = pos.square(us); + Square kfrom = pos.square(Us); Square rfrom = pos.castling_rook_square(Cr); - Square kto = relative_square(us, KingSide ? SQ_G1 : SQ_C1); - Bitboard enemies = pos.pieces(~us); + Square kto = relative_square(Us, KingSide ? SQ_G1 : SQ_C1); + Bitboard enemies = pos.pieces(~Us); assert(!pos.checkers()); @@ -52,7 +53,7 @@ namespace { // Because we generate only legal castling moves we need to verify that // when moving the castling rook we do not discover some hidden checker. // For instance an enemy queen in SQ_A1 when castling rook is in SQ_B1. - if (Chess960 && (attacks_bb(kto, pos.pieces() ^ rfrom) & pos.pieces(~us, ROOK, QUEEN))) + if (Chess960 && (attacks_bb(kto, pos.pieces() ^ rfrom) & pos.pieces(~Us, ROOK, QUEEN))) return moveList; Move m = make(kfrom, rfrom); @@ -277,17 +278,17 @@ namespace { *moveList++ = make_move(ksq, pop_lsb(&b)); } - if (Type != CAPTURES && Type != EVASIONS && pos.can_castle(Us)) + if (Type != CAPTURES && Type != EVASIONS && pos.castling_rights(Us)) { if (pos.is_chess960()) { - moveList = generate_castling::right, Checks, true>(pos, moveList, Us); - moveList = generate_castling::right, Checks, true>(pos, moveList, Us); + moveList = generate_castling(pos, moveList); + moveList = generate_castling(pos, moveList); } else { - moveList = generate_castling::right, Checks, false>(pos, moveList, Us); - moveList = generate_castling::right, Checks, false>(pos, moveList, Us); + moveList = generate_castling(pos, moveList); + moveList = generate_castling(pos, moveList); } }