void GameAdjudicator::addEval(const Chess::Board* board, const MoveEvaluation& eval) { Chess::Side side = board->sideToMove().opposite(); // Tablebase adjudication if (m_tbEnabled) { m_result = board->tablebaseResult(); if (!m_result.isNone()) return; } // Moves forced by the user (eg. from opening book or played by user) if (eval.depth() <= 0) { m_drawScoreCount = 0; m_resignScoreCount[side] = 0; return; } // Draw adjudication if (m_drawMoveNum > 0) { if (qAbs(eval.score()) <= m_drawScore) m_drawScoreCount++; else m_drawScoreCount = 0; if (board->plyCount() / 2 >= m_drawMoveNum && m_drawScoreCount >= m_drawMoveCount * 2) { m_result = Chess::Result(Chess::Result::Adjudication, Chess::Side::NoSide); return; } } // Resign adjudication if (m_resignMoveCount > 0) { int& count = m_resignScoreCount[side]; if (eval.score() <= m_resignScore) count++; else count = 0; if (count >= m_resignMoveCount) m_result = Chess::Result(Chess::Result::Adjudication, side.opposite()); } }