Key key, pawnKey, materialKey;
int rule50;
Move lastMove;
- PieceType capture;
Value mgValue, egValue;
+ PieceType capture;
};
class Position {
friend class MaterialInfo;
+ friend class EndgameFunctions;
public:
// Constructors
Position() {};
- Position(const Position &pos);
- Position(const std::string &fen);
+ Position(const Position& pos);
+ Position(const std::string& fen);
// Text input/output
- void from_fen(const std::string &fen);
+ void from_fen(const std::string& fen);
const std::string to_fen() const;
- void print() const;
+ void print(Move m = MOVE_NONE) const;
// Copying
void copy(const Position &pos);
// Number of pieces of each color and type
int piece_count(Color c, PieceType pt) const;
- // The en passant square:
+ // The en passant square
Square ep_square() const;
// Current king position for each color
Square king_square(Color c) const;
- // Castling rights.
+ // Castling rights
bool can_castle_kingside(Color c) const;
bool can_castle_queenside(Color c) const;
bool can_castle(Color c) const;
// Static exchange evaluation
int see(Square from, Square to) const;
int see(Move m) const;
+ int see(Square to) const;
// Accessing hash keys
Key get_key() const;
Value mg_pst_delta(Move m) const;
// Game termination checks
- bool is_mate();
+ bool is_mate() const;
bool is_draw() const;
// Check if one side threatens a mate in one
void allow_ooo(Color c);
// Helper functions for doing and undoing moves
+ void do_capture_move(Move m, PieceType capture, Color them, Square to);
void do_castle_move(Move m);
void do_promotion_move(Move m, UndoInfo &u);
void do_ep_move(Move m);
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;
return StepAttackBB[pawn_of_color(c)][s];
}
+template<>
+inline Bitboard Position::piece_attacks<PAWN>(Square s) const {
+ return StepAttackBB[pawn_of_color(opposite_color(sideToMove))][s];
+}
+
template<>
inline Bitboard Position::piece_attacks<KNIGHT>(Square s) const {
return StepAttackBB[KNIGHT][s];
return bit_is_set(piece_attacks<Piece>(f), t);
}
+inline Bitboard Position::attacks_to(Square s, Color c) const {
+
+ return attacks_to(s) & pieces_of_color(c);
+}
+
+inline bool Position::square_is_attacked(Square s, Color c) const {
+
+ return attacks_to(s, c) != EmptyBoardBB;
+}
+
inline bool Position::pawn_is_passed(Color c, Square s) const {
return !(pawns(opposite_color(c)) & passed_pawn_mask(c, s));
}