#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;
class Position {
- // No default or copy c'tor allowed, default c'tor will not be generated
- // anyhow because of user-defined c'tors.
+ // No defaul, copy c'tor or assignment allowed, default c'tor will not be
+ // generated anyhow because of user-defined c'tors.
Position(const Position&);
+ Position& operator=(const Position&);
public:
Position(const Position& pos, int threadID);
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
// Position consistency check, for debugging
bool is_ok(int* failedStep = NULL) const;
- void flip();
+ void flip_me();
// Global initialization
static void init();
// 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 bool Position::square_is_empty(Square s) const {
- return piece_on(s) == PIECE_NONE;
+ return board[s] == PIECE_NONE;
}
inline Color Position::side_to_move() const {
}
inline Bitboard Position::empty_squares() const {
- return ~occupied_squares();
+ return ~byTypeBB[0];
}
inline Bitboard Position::pieces(Color c) const {
}
inline bool Position::in_check() const {
- return st->checkersBB != EmptyBoardBB;
+ return st->checkersBB != 0;
}
inline bool Position::pawn_is_passed(Color c, Square s) const {
- return !(pieces(PAWN, opposite_color(c)) & passed_pawn_mask(c, s));
+ return !(pieces(PAWN, flip(c)) & passed_pawn_mask(c, s));
}
inline Key Position::get_key() const {
inline bool Position::move_is_passed_pawn_push(Move m) const {
- Color c = side_to_move();
- return piece_on(move_from(m)) == make_piece(c, PAWN)
- && pawn_is_passed(c, move_to(m));
+ return board[move_from(m)] == make_piece(sideToMove, PAWN)
+ && pawn_is_passed(sideToMove, move_to(m));
}
inline int Position::startpos_ply_counter() const {
- return Max(2 * (fullMoves - 1), 0) + int(sideToMove == BLACK);
+ return startPosPly + st->pliesFromNull; // HACK
}
inline bool Position::opposite_colored_bishops() const {
- return piece_count(WHITE, BISHOP) == 1
- && piece_count(BLACK, BISHOP) == 1
- && opposite_color_squares(piece_list(WHITE, BISHOP)[0], piece_list(BLACK, BISHOP)[0]);
+ return pieceCount[WHITE][BISHOP] == 1
+ && pieceCount[BLACK][BISHOP] == 1
+ && opposite_colors(pieceList[WHITE][BISHOP][0], pieceList[BLACK][BISHOP][0]);
}
inline bool Position::has_pawn_on_7th(Color c) const {