/// Variables
CACHE_LINE_ALIGNMENT
- const MovegenPhaseT MainSearchPhaseTable[] = { PH_STOP, PH_TT_MOVES, PH_GOOD_CAPTURES, PH_KILLERS, PH_NONCAPTURES, PH_BAD_CAPTURES, PH_STOP};
+ const MovegenPhaseT MainSearchPhaseTable[] = { PH_STOP, PH_NULL_MOVE, PH_TT_MOVES, PH_GOOD_CAPTURES, PH_KILLERS, PH_NONCAPTURES, PH_BAD_CAPTURES, PH_STOP};
const MovegenPhaseT EvasionsPhaseTable[] = { PH_STOP, PH_EVASIONS, PH_STOP};
const MovegenPhaseT QsearchWithChecksPhaseTable[] = { PH_STOP, PH_TT_MOVES, PH_QCAPTURES, PH_QCHECKS, PH_STOP};
const MovegenPhaseT QsearchWithoutChecksPhaseTable[] = { PH_STOP, PH_TT_MOVES, PH_QCAPTURES, PH_STOP};
/// move ordering is at the current node.
MovePicker::MovePicker(const Position& p, Move ttm, Depth d,
- const History& h, SearchStack* ss) : pos(p), H(h) {
+ const History& h, SearchStack* ss, bool useNullMove) : pos(p), H(h) {
ttMoves[0] = ttm;
if (ss)
{
phasePtr++;
switch (*phasePtr) {
+ case PH_NULL_MOVE:
+ break;
+
case PH_TT_MOVES:
movesPicked = 0; // This is used as index to ttMoves[]
break;
struct SearchStack;
enum MovegenPhase {
+ PH_NULL_MOVE, // Null move
PH_TT_MOVES, // Transposition table move and mate killer
PH_GOOD_CAPTURES, // Queen promotions and captures with SEE values >= 0
PH_KILLERS, // Killer moves from the current ply
MovePicker& operator=(const MovePicker&); // silence a warning under MSVC
public:
- MovePicker(const Position& p, Move ttm, Depth d, const History& h, SearchStack* ss = NULL);
+ MovePicker(const Position& p, Move ttm, Depth d, const History& h, SearchStack* ss = NULL, bool useNullMove = false);
Move get_next_move();
Move get_next_move(Lock& lock);
int number_of_moves() const;