struct UndoInfo {
int castleRights;
Square epSquare;
- Bitboard checkersBB;
+ Bitboard checkersBB, pinners[2], pinned[2], dcCandidates[2];
Key key, pawnKey, materialKey;
int rule50;
Move lastMove;
- PieceType capture;
Value mgValue, egValue;
+ PieceType capture;
};
// Bitboards for pinned pieces and discovered check candidates
Bitboard discovered_check_candidates(Color c) const;
+ Bitboard pinned_pieces(Color c, Bitboard& p) const;
Bitboard pinned_pieces(Color c) const;
// Checking pieces
template<PieceType>
Bitboard piece_attacks_square(Square f, Square t) const; // Dispatch at compile-time
- bool piece_attacks_square(Square f, Square t) const; // Dispatch at run-time
+ bool piece_attacks_square(Piece p, Square f, Square t) const; // Dispatch at run-time
// Properties of moves
bool pl_move_is_legal(Move m) const;
- bool pl_move_is_legal(Move m, Bitboard pinned) const;
bool move_is_check(Move m) const;
- bool move_is_check(Move m, Bitboard dcCandidates) const;
bool move_is_capture(Move m) const;
bool move_is_deep_pawn_push(Move m) const;
bool move_is_pawn_push_to_7th(Move m) const;
void backup(UndoInfo &u) const;
void restore(const UndoInfo &u);
void do_move(Move m, UndoInfo &u);
- void do_move(Move m, UndoInfo &u, Bitboard dcCandidates);
void undo_move(Move m, const UndoInfo &u);
void do_null_move(UndoInfo &u);
void undo_null_move(const UndoInfo &u);
void undo_ep_move(Move m);
void find_checkers();
+ template<PieceType Piece>
+ void update_checkers(Bitboard* pCheckersBB, Square ksq, Square from, Square to, Bitboard dcCandidates);
+
template<PieceType Piece, bool FindPinned>
- Bitboard hidden_checks(Color c, Square ksq) const;
+ Bitboard hidden_checks(Color c, Square ksq, Bitboard& pinners) const;
// Computing hash keys from scratch (for initialization and debugging)
Key compute_key() const;
// Bitboards
Bitboard byColorBB[2], byTypeBB[8];
Bitboard checkersBB;
+ mutable Bitboard pinners[2], pinned[2], dcCandidates[2];
// Board
Piece board[64];
}
inline Bitboard Position::pawn_attacks(Color c, Square s) const {
- return StepAttackBB[pawn_of_color(c)][s];
+ return StepAttackBB[piece_of_color_and_type(c, PAWN)][s];
+}
+
+template<>
+inline Bitboard Position::piece_attacks<PAWN>(Square s) const {
+ return StepAttackBB[piece_of_color_and_type(opposite_color(sideToMove), PAWN)][s];
}
template<>
inline bool Position::move_is_deep_pawn_push(Move m) const {
Color c = side_to_move();
- return piece_on(move_from(m)) == pawn_of_color(c)
+ return piece_on(move_from(m)) == piece_of_color_and_type(c, PAWN)
&& relative_rank(c, move_to(m)) > RANK_4;
}
inline bool Position::move_is_pawn_push_to_7th(Move m) const {
Color c = side_to_move();
- return piece_on(move_from(m)) == pawn_of_color(c)
+ return piece_on(move_from(m)) == piece_of_color_and_type(c, PAWN)
&& relative_rank(c, move_to(m)) == RANK_7;
}
inline bool Position::move_is_passed_pawn_push(Move m) const {
Color c = side_to_move();
- return piece_on(move_from(m)) == pawn_of_color(c)
+ return piece_on(move_from(m)) == piece_of_color_and_type(c, PAWN)
&& pawn_is_passed(c, move_to(m));
}
inline bool Position::move_was_passed_pawn_push(Move m) const {
Color c = opposite_color(side_to_move());
- return piece_on(move_to(m)) == pawn_of_color(c)
+ return piece_on(move_to(m)) == piece_of_color_and_type(c, PAWN)
&& pawn_is_passed(c, move_to(m));
}