From 4f96d189fa7c17becde223cb61e03dd22c7c5453 Mon Sep 17 00:00:00 2001 From: Arthur Bols Date: Thu, 22 Dec 2022 18:38:16 +0100 Subject: [PATCH] [Board] Initial pseudoLegalMovesFrom --- Board.cpp | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/Board.cpp b/Board.cpp index af39734..20467e6 100644 --- a/Board.cpp +++ b/Board.cpp @@ -150,8 +150,41 @@ void Board::pseudoLegalMoves(MoveVec &moves) const { } void Board::pseudoLegalMovesFrom(const Square &from, Board::MoveVec &moves) const { - (void) from; - (void) moves; + auto fromBB = BitBoard::fromIndex(from.index()); + + if (!(fromBB & mPieceBBs[toIndex(mTurn)])) { + return; + } + + auto p = Piece(mTurn, pieceType(fromBB)); + + BitBoard movesBB; + switch (p.type()) { + case PieceType::Pawn:mMoveGenerator->generatePawnMoves(from, mEPS, mTurn, moves); + return; + case PieceType::Knight: break; + case PieceType::Bishop:movesBB = BitBoard::bishopAttacks(fromBB, ~*mOccupiedBB) & ~mPieceBBs[toIndex(mTurn)]; + break; + case PieceType::Rook: break; + case PieceType::Queen: break; + + case PieceType::King:movesBB = BitBoard::kingAttacks(fromBB) & ~mPieceBBs[toIndex(mTurn)]; + if (hasCastlingRights()) { + if (mTurn == PieceColor::White) { + movesBB |= BitBoard::castlingMoves(fromBB, ~mPieceBBs[toIndex(PieceType::Rook)], ~*mOccupiedBB) + & WhiteCastlingRank; + } else { + movesBB |= BitBoard::castlingMoves(fromBB, ~mPieceBBs[toIndex(PieceType::Rook)], ~*mOccupiedBB) + & BlackCastlingRank; + } + } + break; + } + + while (movesBB) { + auto to = Square(movesBB.pop()); + moves.emplace_back(from, to, std::nullopt); + } } void Board::handleCastlingRights(const Piece &piece, const BitBoard &bb) { if (piece.type() != PieceType::King && piece.type() != PieceType::Rook) { @@ -200,6 +233,14 @@ bool Board::isMoveCastling(const BitBoard &from, const BitBoard &to, const Piece return from & BitBoard::fromIndex(E8); } +constexpr bool Board::hasCastlingRights() const { + switch (mTurn) { + case PieceColor::White:return (mCR & CastlingRights::White) != CastlingRights::None; + case PieceColor::Black:return (mCR & CastlingRights::Black) != CastlingRights::None; + } + + return false; +} std::ostream &operator<<(std::ostream &os, const Board &board) { // For debugging only, performance isn't important