#include "piece.hpp" #include "../board.hpp" #include "../coords.hpp" std::vector keep_only_blocking(const std::vector candidates, const Board& board) { if (candidates.size() == 0) return {}; int8_t my_colour = board.colour_at(candidates[0].source_square); std::vector ret; for (Move move : candidates) { Board board_after_move = board.make_move(move); if (!board_after_move.is_check_for(my_colour)) ret.push_back(move); } return ret; } std::vector legal_moves(int8_t p, const Board& b, const Coords xy, bool looking_for_check) { std::vector ret; int8_t simple_piece = p & 0b00111; switch (simple_piece) { case Piece::Pawn: ret = pawn_moves(b, xy); break; case Piece::Bishop: ret = bishop_moves(b, xy); break; case Piece::Rook: ret = rook_moves(b, xy); break; case Piece::Knigt: ret = knight_moves(b, xy); break; case Piece::Queen: ret = queen_moves(b, xy); break; case Piece::King: ret = king_moves(b, xy); break; default: break; } if (!looking_for_check) return keep_only_blocking(ret, b); return ret; } std::optional move_for_position(const Board& board, const Coords source, const Coords dest) { if (!dest.is_within_bounds() || board.colour_at(source) == board.colour_at(dest)) return {}; return Move{source.to_index(), dest.to_index()}; } std::vector look_direction(const Board& board, const Coords xy, int mult_dx, int mult_dy) { std::vector ret; for (int d = 1; d < 8; d++) { int dx = mult_dx * d; int dy = mult_dy * d; Coords target{xy.x + dx, xy.y + dy}; std::optional move = move_for_position(board, xy, target); if (move.has_value()) { ret.push_back(move.value()); if (board.squares[target.to_index()] != Piece::None) break; } else { break; } } return ret; }