//// Types
////
+/// struct checkInfo is initialized at c'tor time and keeps
+/// info used to detect if a move gives check.
+
+struct CheckInfo {
+
+ CheckInfo(const Position&);
+
+ Square ksq;
+ Bitboard dcCandidates;
+ Bitboard checkSq[8];
+};
+
/// Castle rights, encoded as bit fields
enum CastleRights {
};
// Constructors
- Position() {}
- Position(const Position& pos);
- Position(const std::string& fen);
+ Position();
+ explicit Position(const Position& pos);
+ explicit Position(const std::string& fen);
// Text input/output
void from_fen(const std::string& fen);
void print(Move m = MOVE_NONE) const;
// Copying
- void copy(const Position& pos);
+ void fast_copy(const Position& pos);
void flipped_copy(const Position& pos);
// The piece on a given square
bool pl_move_is_legal(Move m, Bitboard pinned) const;
bool pl_move_is_evasion(Move m, Bitboard pinned) const;
bool move_is_check(Move m) const;
- bool move_is_check(Move m, Bitboard dcCandidates) const;
+ bool move_is_check(Move m, const CheckInfo& ci) const;
bool move_is_capture(Move m) const;
bool move_is_capture_or_promotion(Move m) const;
bool move_is_passed_pawn_push(Move m) const;
bool move_attacks_square(Move m, Square s) const;
+ // Piece captured with previous moves
+ PieceType captured_piece() const;
+
// Information about pawns
bool pawn_is_passed(Color c, Square s) const;
static bool pawn_is_passed(Bitboard theirPawns, Color c, Square s);
bool square_is_weak(Square s, Color c) const;
// Doing and undoing moves
- void saveState();
+ void detach();
void do_move(Move m, StateInfo& st);
- void do_move(Move m, StateInfo& st, Bitboard dcCandidates);
+ void do_move(Move m, StateInfo& st, const CheckInfo& ci, bool moveIsCheck);
void undo_move(Move m);
void do_null_move(StateInfo& st);
void undo_null_move();
// Accessing hash keys
Key get_key() const;
+ Key get_exclusion_key() const;
Key get_pawn_key() const;
Key get_material_key() const;
// Incremental evaluation
Score value() const;
Value non_pawn_material(Color c) const;
- Phase game_phase() const;
Score pst_delta(Piece piece, Square from, Square to) const;
// Game termination checks
void undo_castle_move(Move m);
void find_checkers();
- template<PieceType Piece>
- void update_checkers(Bitboard* pCheckersBB, Square ksq, Square from, Square to, Bitboard dcCandidates);
-
template<bool FindPinned>
Bitboard hidden_checkers(Color c) const;
static Key zobMaterial[2][8][16];
static Key zobSideToMove;
static Score PieceSquareTable[16][64];
+ static Key zobExclusion;
};
return st->key;
}
+inline Key Position::get_exclusion_key() const {
+ return st->key ^ zobExclusion;
+}
+
inline Key Position::get_pawn_key() const {
return st->pawnKey;
}
return st->npMaterial[c];
}
-inline Phase Position::game_phase() const {
-
- // Values modified by Joona Kiiski
- static const Value MidgameLimit = Value(15581);
- static const Value EndgameLimit = Value(3998);
-
- Value npm = non_pawn_material(WHITE) + non_pawn_material(BLACK);
-
- if (npm >= MidgameLimit)
- return PHASE_MIDGAME;
- else if(npm <= EndgameLimit)
- return PHASE_ENDGAME;
- else
- return Phase(((npm - EndgameLimit) * 128) / (MidgameLimit - EndgameLimit));
-}
-
inline bool Position::move_is_passed_pawn_push(Move m) const {
Color c = side_to_move();
return (m & (0x1F << 12)) ? !move_is_castle(m) : !square_is_empty(move_to(m));
}
+inline PieceType Position::captured_piece() const {
+ return st->capture;
+}
+
#endif // !defined(POSITION_H_INCLUDED)