Color them = opposite_color(us);
ksq = pos.king_square(them);
- dc = pos.discovered_check_candidates(us);
+ dcCandidates = pos.discovered_check_candidates(us);
checkSq[PAWN] = pos.attacks_from<PAWN>(ksq, them);
checkSq[KNIGHT] = pos.attacks_from<KNIGHT>(ksq);
bool Position::move_is_check(Move m) const {
- Bitboard dc = discovered_check_candidates(side_to_move());
- return move_is_check(m, dc);
+ return move_is_check(m, CheckInfo(*this));
}
-bool Position::move_is_check(Move m, Bitboard dcCandidates) const {
+bool Position::move_is_check(Move m, const CheckInfo& ci) const {
+
+ Bitboard dcCandidates = ci.dcCandidates;
assert(is_ok());
assert(move_is_ok(m));
CheckInfo(const Position&);
Square ksq;
- Bitboard dc;
+ Bitboard dcCandidates;
Bitboard checkSq[8];
};
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;
isCheck = pos.is_check();
mateThreat = pos.has_mate_threat(opposite_color(pos.side_to_move()));
CheckInfo ci(pos);
- dcCandidates = ci.dc;
+ dcCandidates = ci.dcCandidates;
MovePicker mp = MovePicker(pos, ttMove, depth, H, &ss[ply]);
// Loop through all legal moves until no moves remain or a beta cutoff
assert(move_is_ok(move));
singleReply = (isCheck && mp.number_of_evasions() == 1);
- moveIsCheck = pos.move_is_check(move, dcCandidates);
+ moveIsCheck = pos.move_is_check(move, ci);
captureOrPromotion = pos.move_is_capture_or_promotion(move);
movesSearched[moveCount++] = ss[ply].currentMove = move;
// to search all moves.
MovePicker mp = MovePicker(pos, ttMove, depth, H, &ss[ply]);
CheckInfo ci(pos);
- dcCandidates = ci.dc;
+ dcCandidates = ci.dcCandidates;
futilityValue = VALUE_NONE;
useFutilityPruning = depth < SelectiveDepth && !isCheck;
assert(move_is_ok(move));
singleReply = (isCheck && mp.number_of_evasions() == 1);
- moveIsCheck = pos.move_is_check(move, dcCandidates);
+ moveIsCheck = pos.move_is_check(move, ci);
captureOrPromotion = pos.move_is_capture_or_promotion(move);
movesSearched[moveCount++] = ss[ply].currentMove = move;
// queen promotions and checks (only if depth == 0) will be generated.
MovePicker mp = MovePicker(pos, ttMove, depth, H);
CheckInfo ci(pos);
- dcCandidates = ci.dc;
+ dcCandidates = ci.dcCandidates;
enoughMaterial = pos.non_pawn_material(pos.side_to_move()) > RookValueMidgame;
// Loop through the moves until no moves remain or a beta cutoff
&& !isCheck
&& !pvNode
&& !move_is_promotion(move)
- && !pos.move_is_check(move, dcCandidates)
+ && !pos.move_is_check(move, ci)
&& !pos.move_is_passed_pawn_push(move))
{
futilityValue = staticValue
assert(ActiveThreads > 1);
Position pos = Position(sp->pos);
+ CheckInfo ci(pos);
SearchStack* ss = sp->sstack[threadID];
Value value;
Move move;
{
assert(move_is_ok(move));
- bool moveIsCheck = pos.move_is_check(move, sp->dcCandidates);
+ bool moveIsCheck = pos.move_is_check(move, ci);
bool captureOrPromotion = pos.move_is_capture_or_promotion(move);
lock_grab(&(sp->lock));
assert(ActiveThreads > 1);
Position pos = Position(sp->pos);
+ CheckInfo ci(pos);
SearchStack* ss = sp->sstack[threadID];
Value value;
Move move;
&& !thread_should_stop(threadID)
&& (move = sp->mp->get_next_move(sp->lock)) != MOVE_NONE)
{
- bool moveIsCheck = pos.move_is_check(move, sp->dcCandidates);
+ bool moveIsCheck = pos.move_is_check(move, ci);
bool captureOrPromotion = pos.move_is_capture_or_promotion(move);
assert(move_is_ok(move));