X-Git-Url: https://git.sesse.net/?p=stockfish;a=blobdiff_plain;f=src%2Fposition.h;h=18be2ec6928df5c695eed3e2cd09af7b46897461;hp=18c783f0836ecd6b0d92157ae731472d5040f6ea;hb=081af9080542a0d076a5482da37103a96ee15f64;hpb=ad2a0e356e395038a08324f9ff0afee7fc98b8e9 diff --git a/src/position.h b/src/position.h index 18c783f0..18be2ec6 100644 --- a/src/position.h +++ b/src/position.h @@ -43,7 +43,6 @@ struct StateInfo { int castlingRights; int rule50; int pliesFromNull; - Score psq; Square epSquare; // Not copied when making a move (will be recomputed anyhow) @@ -52,7 +51,7 @@ struct StateInfo { Piece capturedPiece; StateInfo* previous; Bitboard blockersForKing[COLOR_NB]; - Bitboard pinnersForKing[COLOR_NB]; + Bitboard pinners[COLOR_NB]; Bitboard checkSquares[PIECE_TYPE_NB]; }; @@ -152,6 +151,8 @@ public: bool is_chess960() const; Thread* this_thread() const; bool is_draw(int ply) const; + bool has_game_cycle(int ply) const; + bool has_repeated() const; int rule50_count() const; Score psq_score() const; Value non_pawn_material(Color c) const; @@ -186,11 +187,16 @@ private: Bitboard castlingPath[CASTLING_RIGHT_NB]; int gamePly; Color sideToMove; + Score psq; Thread* thisThread; StateInfo* st; bool chess960; }; +namespace PSQT { + extern Score psq[PIECE_NB][SQUARE_NB]; +} + extern std::ostream& operator<<(std::ostream& os, const Position& pos); inline Color Position::side_to_move() const { @@ -325,7 +331,7 @@ inline Key Position::material_key() const { } inline Score Position::psq_score() const { - return st->psq; + return psq; } inline Value Position::non_pawn_material(Color c) const { @@ -382,6 +388,7 @@ inline void Position::put_piece(Piece pc, Square s) { index[s] = pieceCount[pc]++; pieceList[pc][index[s]] = s; pieceCount[make_piece(color_of(pc), ALL_PIECES)]++; + psq += PSQT::psq[pc][s]; } inline void Position::remove_piece(Piece pc, Square s) { @@ -399,20 +406,22 @@ inline void Position::remove_piece(Piece pc, Square s) { pieceList[pc][index[lastSquare]] = lastSquare; pieceList[pc][pieceCount[pc]] = SQ_NONE; pieceCount[make_piece(color_of(pc), ALL_PIECES)]--; + psq -= PSQT::psq[pc][s]; } inline void Position::move_piece(Piece pc, Square from, Square to) { // index[from] is not updated and becomes stale. This works as long as index[] // is accessed just by known occupied squares. - Bitboard from_to_bb = SquareBB[from] ^ SquareBB[to]; - byTypeBB[ALL_PIECES] ^= from_to_bb; - byTypeBB[type_of(pc)] ^= from_to_bb; - byColorBB[color_of(pc)] ^= from_to_bb; + Bitboard fromTo = SquareBB[from] ^ SquareBB[to]; + byTypeBB[ALL_PIECES] ^= fromTo; + byTypeBB[type_of(pc)] ^= fromTo; + byColorBB[color_of(pc)] ^= fromTo; board[from] = NO_PIECE; board[to] = pc; index[to] = index[from]; pieceList[pc][index[to]] = to; + psq += PSQT::psq[pc][to] - PSQT::psq[pc][from]; } inline void Position::do_move(Move m, StateInfo& newSt) {