|
@@ -55,6 +55,9 @@ public:
|
|
|
inline void iterateKing(Args&&... args);
|
|
|
|
|
|
template<Side side, typename... Args>
|
|
|
+ inline void iterateCastling(Args&&... args);
|
|
|
+
|
|
|
+ template<Side side, typename... Args>
|
|
|
inline void iteratePawns(Args&&... args);
|
|
|
|
|
|
template<Side side, typename... Args>
|
|
@@ -111,6 +114,7 @@ inline void chessy::Search<T>::iterateAll(Args&&... args)
|
|
|
iterateRooks<side, Args...>(std::forward<Args>(args)...);
|
|
|
iterateQueens<side, Args...>(std::forward<Args>(args)...);
|
|
|
iterateKing<side, Args...>(std::forward<Args>(args)...);
|
|
|
+ iterateCastling<side, Args...>(std::forward<Args>(args)...);
|
|
|
|
|
|
/*
|
|
|
|
|
@@ -262,6 +266,26 @@ inline void chessy::Search<T>::iterateKing(Args&&... args)
|
|
|
|
|
|
template<typename T>
|
|
|
template<chessy::Side side, typename... Args>
|
|
|
+inline void chessy::Search<T>::iterateCastling(Args&&... args)
|
|
|
+{
|
|
|
+ MoveInfo moveInfo;
|
|
|
+ moveInfo.movedPiece = PieceType::KING;
|
|
|
+ if (game.getCanCastleKingSide(side)) {
|
|
|
+ Bitboard king = board.getKing<side>();
|
|
|
+ Bitboard target = king.bits >> 2; // move king to the right
|
|
|
+ Bitboard rook = king.bits >> 3;
|
|
|
+ Bitboard rookTarget = king.bits >> 1;
|
|
|
+ if (!(target | friends<WHITE_SIDE>() | friends<BLACK_SIDE>()) &&
|
|
|
+ !(rookTarget | friends<WHITE_SIDE>() | friends<BLACK_SIDE>())) {
|
|
|
+
|
|
|
+ }
|
|
|
+ moveInfo.move = Move{ king, target, true };
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+template<typename T>
|
|
|
+template<chessy::Side side, typename... Args>
|
|
|
inline void chessy::Search<T>::iterateSinglePawnPushes(Args&&... args)
|
|
|
{
|
|
|
MoveInfo moveInfo;
|