static bool RequestPending = false;
-////
-//// Functions
-////
/// Constructors
+CheckInfo::CheckInfo(const Position& pos) {
+
+ Color us = pos.side_to_move();
+ Color them = opposite_color(us);
+
+ ksq = pos.king_square(them);
+ dc = pos.discovered_check_candidates(us);
+
+ checkSq[PAWN] = pos.attacks_from<PAWN>(ksq, them);
+ checkSq[KNIGHT] = pos.attacks_from<KNIGHT>(ksq);
+ checkSq[BISHOP] = pos.attacks_from<BISHOP>(ksq);
+ checkSq[ROOK] = pos.attacks_from<ROOK>(ksq);
+ checkSq[QUEEN] = checkSq[BISHOP] | checkSq[ROOK];
+ checkSq[KING] = EmptyBoardBB;
+}
+
Position::Position(const Position& pos) {
copy(pos);
}
// ones which are recalculated from scratch anyway, then switch our state
// pointer to point to the new, ready to be updated, state.
struct ReducedStateInfo {
- Key key, pawnKey, materialKey;
+ Key pawnKey, materialKey;
int castleRights, rule50, pliesFromNull;
Square epSquare;
Value value;
Piece piece = piece_on(from);
PieceType pt = type_of_piece(piece);
+ PieceType capture = ep ? PAWN : type_of_piece_on(to);
assert(color_of_piece_on(from) == us);
assert(color_of_piece_on(to) == them || square_is_empty(to));
assert(!(ep || pm) || piece == piece_of_color_and_type(us, PAWN));
assert(!pm || relative_rank(us, to) == RANK_8);
- st->capture = ep ? PAWN : type_of_piece_on(to);
-
- if (st->capture)
- do_capture_move(key, st->capture, them, to, ep);
+ if (capture)
+ do_capture_move(key, capture, them, to, ep);
// Update hash key
key ^= zobrist[us][pt][from] ^ zobrist[us][pt][to];
st->pawnKey ^= zobrist[us][PAWN][from] ^ zobrist[us][PAWN][to];
// Set en passant square, only if moved pawn can be captured
- if (abs(int(to) - int(from)) == 16)
+ if ((to ^ from) == 16)
{
if (attacks_from<PAWN>(from + (us == WHITE ? DELTA_N : DELTA_S), us) & pieces(PAWN, them))
{
// Update incremental scores
st->value += pst_delta(piece, from, to);
+ // Set capture piece
+ st->capture = capture;
+
if (pm) // promotion ?
{
PieceType promotion = move_promotion_piece(m);