void ChessGame::onResultClaim(const Chess::Result& result) { if (m_finished) return; ChessPlayer* sender = qobject_cast<ChessPlayer*>(QObject::sender()); Q_ASSERT(sender != 0); if (!m_gameInProgress && result.winner().isNull()) { qWarning("Unexpected result claim from %s: %s", qPrintable(sender->name()), qPrintable(result.toVerboseString())); } else if (sender->areClaimsValidated() && result.loser() != sender->side()) { qWarning("%s forfeits by invalid result claim: %s", qPrintable(sender->name()), qPrintable(result.toVerboseString())); m_result = Chess::Result(Chess::Result::Adjudication, sender->side().opposite(), "Invalid result claim"); } else m_result = result; stop(); }
void ChessGame::onResultClaim(const Chess::Result& result) { if (m_finished) return; ChessPlayer* sender = qobject_cast<ChessPlayer*>(QObject::sender()); Q_ASSERT(sender != nullptr); if (result.type() == Chess::Result::Disconnection) { // The engine may not be properly started so we have to // figure out the player's side this way Chess::Side side(Chess::Side::White); if (m_player[side] != sender) side = Chess::Side::Black; m_result = Chess::Result(result.type(), side.opposite()); } else if (!m_gameInProgress && result.winner().isNull()) { qWarning("Unexpected result claim from %s: %s", qPrintable(sender->name()), qPrintable(result.toVerboseString())); } else if (sender->areClaimsValidated() && result.loser() != sender->side()) { qWarning("%s forfeits by invalid result claim: %s", qPrintable(sender->name()), qPrintable(result.toVerboseString())); m_result = Chess::Result(Chess::Result::Adjudication, sender->side().opposite(), "Invalid result claim"); } else m_result = result; stop(); }
void ChessGame::onMoveMade(const Chess::Move& move) { ChessPlayer* sender = qobject_cast<ChessPlayer*>(QObject::sender()); Q_ASSERT(sender != nullptr); Q_ASSERT(m_gameInProgress); Q_ASSERT(m_board->isLegalMove(move)); if (sender != playerToMove()) { qDebug("%s tried to make a move on the opponent's turn", qPrintable(sender->name())); return; } m_scores[m_moves.size()] = sender->evaluation().score(); m_moves.append(move); addPgnMove(move, evalString(sender->evaluation())); // Get the result before sending the move to the opponent m_board->makeMove(move); m_result = m_board->result(); if (m_result.isNone()) { if (m_board->reversibleMoveCount() == 0) m_adjudicator.resetDrawMoveCount(); m_adjudicator.addEval(m_board, sender->evaluation()); m_result = m_adjudicator.result(); } m_board->undoMove(); ChessPlayer* player = playerToWait(); player->makeMove(move); m_board->makeMove(move); if (m_result.isNone()) { emitLastMove(); startTurn(); } else { stop(false); emitLastMove(); } }