#include "move.h"
#include "types.h"
-/// Maximum number of plies per game (220 should be enough, because the
-/// maximum search depth is 100, and during position setup we reset the
-/// move counter for every non-reversible move).
-const int MaxGameLength = 220;
-
/// The checkInfo struct is initialized at c'tor time and keeps info used
/// to detect if a move gives check.
struct StateInfo {
Key pawnKey, materialKey;
- int castleRights, rule50, gamePly, pliesFromNull;
- Square epSquare;
- Score value;
Value npMaterial[2];
+ int castleRights, rule50, pliesFromNull;
+ Score value;
+ Square epSquare;
Key key;
Bitboard checkersBB;
bool pawn_is_passed(Color c, Square s) const;
// Doing and undoing moves
- void do_setup_move(Move m);
void do_move(Move m, StateInfo& st);
void do_move(Move m, StateInfo& st, const CheckInfo& ci, bool moveIsCheck);
void undo_move(Move m);
bool is_mate() const;
template<bool SkipRepetition> bool is_draw() const;
- // Number of plies from starting position
+ // Plies from start position to the beginning of search
int startpos_ply_counter() const;
// Other properties of the position
// Initialization helper functions (used while setting up a position)
void clear();
- void detach();
void put_piece(Piece p, Square s);
void set_castle(int f, Square ksq, Square rsq);
void set_castling_rights(char token);
int index[64]; // [square]
// Other info
- Key history[MaxGameLength];
int castleRightsMask[64]; // [square]
Square castleRookSquare[16]; // [castleRight]
StateInfo startState;
int64_t nodes;
+ int startPosPly;
Color sideToMove;
- int fullMoves;
int threadID;
StateInfo* st;
int chess960;
}
inline int Position::startpos_ply_counter() const {
- return Max(2 * (fullMoves - 1), 0) + int(sideToMove == BLACK);
+ return startPosPly;
}
inline bool Position::opposite_colored_bishops() const {