// Properties of moves
bool legal(Move m) const;
bool pseudo_legal(const Move m) const;
+ bool capture(Move m) const;
bool capture_stage(Move m) const;
bool gives_check(Move m) const;
Piece moved_piece(Move m) const;
return chess960;
}
+inline bool Position::capture(Move m) const {
+ assert(is_ok(m));
+ return (!empty(to_sq(m)) && type_of(m) != CASTLING)
+ || type_of(m) == EN_PASSANT;
+}
+
// returns true if a move is generated from the capture stage
// having also queen promotions covered, i.e. consistency with the capture stage move generation
// is needed to avoid the generation of duplicate moves.
inline bool Position::capture_stage(Move m) const {
assert(is_ok(m));
- return (!empty(to_sq(m)) && type_of(m) != CASTLING)
- || (type_of(m) == PROMOTION && promotion_type(m) == QUEEN)
- || type_of(m) == EN_PASSANT;
+ return capture(m) || (type_of(m) == PROMOTION && promotion_type(m) == QUEEN);
}
inline Piece Position::captured_piece() const {
for (const Move move : moveList)
{
- if ( !pos.capture_stage(move)
+ if ( !pos.capture(move)
&& (!CheckZeroingMoves || type_of(pos.moved_piece(move)) != PAWN))
continue;
for (const Move move : MoveList<LEGAL>(pos))
{
- bool zeroing = pos.capture_stage(move) || type_of(pos.moved_piece(move)) == PAWN;
+ bool zeroing = pos.capture(move) || type_of(pos.moved_piece(move)) == PAWN;
pos.do_move(move, st);