Git commit b1ab725527f05c0584a24537c5ddded985f8eb45 by Miha Čančula. Committed on 24/03/2011 at 14:24. Pushed by mihac into branch 'master'. Add D-Bus adaptor to enable external control. M +12 -5 src/CMakeLists.txt M +2 -1 src/core/piece.h M +28 -1 src/gamemanager.cpp M +2 -0 src/gamemanager.h M +6 -0 src/rules/chessrules.cpp http://commits.kde.org/knights/b1ab725527f05c0584a24537c5ddded985f8eb45 diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fff01fe..365e36d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,4 +1,4 @@ -set(knights_SRCS offerwidget.cpp gamemanager.cpp proto/textprotocol.cpp +set(knights_SRCS core/pos.cpp core/move.cpp core/renderer.cpp @@ -7,19 +7,25 @@ set(knights_SRCS offerwidget.cpp gamemanager.cpp proto/textprotocol.cpp proto/protocol.cpp proto/localprotocol.cpp + proto/textprotocol.cpp proto/xboardproto.cpp proto/ficsprotocol.cpp - proto/ficsdialog.cpp + proto/seekgraph.cpp proto/chatwidget.cpp - - + proto/ficsdialog.cpp + rules/chessrules.cpp gamedialog.cpp - board.cpp + offerwidget.cpp clock.cpp clockwidget.cpp + + externalcontrol.cpp + gamemanager.cpp + + board.cpp knightsview.cpp knights.cpp main.cpp @@ -53,6 +59,7 @@ kde4_add_ui_files(knights_SRCS ) kde4_add_kcfg_files(knights_SRCS settings.kcfgc ) qt4_add_dbus_interfaces(knights_SRCS ${KDE4_DBUS_INTERFACES_DIR}/org.kde.KSpeech.xml) +qt4_add_dbus_adaptor(knights_SRCS org.kde.Knights.xml externalcontrol.h Knights::ExternalControl) kde4_add_executable(knights ${knights_SRCS}) target_link_libraries(knights ${KDE4_KDEUI_LIBS} ${KDE4_KPARTS_LIBS} ${KDE4_PLASMA_LIBS} ${KDEGAMES_LIBRARY} ${QT_QTNETWORK_LIBRARY}) diff --git a/src/core/piece.h b/src/core/piece.h index 10ffee3..3be1f30 100644 --- a/src/core/piece.h +++ b/src/core/piece.h @@ -35,7 +35,8 @@ namespace Knights Bishop, Knight, Rook, - Pawn + Pawn, + PieceTypeCount }; enum Color { diff --git a/src/gamemanager.cpp b/src/gamemanager.cpp index aa2b41b..20da286 100644 --- a/src/gamemanager.cpp +++ b/src/gamemanager.cpp @@ -34,6 +34,7 @@ #include #include "kspeechinterface.h" +#include "externalcontrol.h" using namespace Knights; @@ -69,6 +70,7 @@ public: QMap offers; org::kde::KSpeech* speech; + ExternalControl* extControl; }; GameManagerPrivate::GameManagerPrivate() @@ -77,7 +79,8 @@ GameManagerPrivate::GameManagerPrivate() gameStarted(false), timer(0), rules(0), - speech(0) + speech(0), + extControl(0) { } @@ -289,6 +292,7 @@ void Manager::initialize() connect ( Protocol::black(), SIGNAL(gameOver(Color)), SLOT(gameOver(Color)) ); Protocol::white()->init(); Protocol::black()->init(); + d->extControl = new ExternalControl(this); } void Manager::setTimeControl(Color color, const TimeControl& control) @@ -465,6 +469,7 @@ void Manager::reset() d->moveHistory.clear(); d->moveUndoStack.clear(); d->gameStarted = false; + delete d->extControl; } Rules* Manager::rules() const @@ -479,6 +484,16 @@ void Manager::setRules(Rules* rules) d->rules = rules; } +void Manager::sendOffer(GameAction action, Color player, int id) +{ + Offer o; + o.action = action; + o.player = player; + o.id = id; + sendOffer(o); +} + + void Manager::sendOffer(const Offer& offer) { Q_D(GameManager); @@ -704,8 +719,20 @@ void Manager::moveByBoard(const Move& move) processMove(move); } +void Manager::moveByExternalControl(const Knights::Move& move) +{ + Q_D(GameManager); + if ( !Protocol::byColor(d->activePlayer)->isLocal() ) + { + return; + } + processMove(move); +} + + void Manager::processMove(const Move& move) { + sendPendingMove(); Q_D(const GameManager); Move m = move; if ( activePlayer() == White ) diff --git a/src/gamemanager.h b/src/gamemanager.h index 97a2f7a..f0c9755 100644 --- a/src/gamemanager.h +++ b/src/gamemanager.h @@ -141,10 +141,12 @@ signals: public slots: void moveByProtocol ( const Move& move ); void moveByBoard ( const Move& move ); + void moveByExternalControl ( const Move& move ); void protocolInitSuccesful(); void gameOver ( Color winner ); void resign(); + void sendOffer ( GameAction action, Color player, int id ); void sendOffer ( const Offer& offer ); void setOfferResult ( int id, OfferAction result ); diff --git a/src/rules/chessrules.cpp b/src/rules/chessrules.cpp index d261b32..64025c7 100644 --- a/src/rules/chessrules.cpp +++ b/src/rules/chessrules.cpp @@ -448,6 +448,12 @@ void ChessRules::checkSpecialFlags ( Move* move, Color color ) move->setFlag(Move::Illegal, true); return; } + if ( !legalMoves ( move->from() ).contains(*move) ) + { + kWarning() << "Illegal move" << move; + move->setFlag(Move::Illegal, true); + return; + } move->setPieceData ( qMakePair( p->color(), p->pieceType() ) ); move->setFlags ( move->flags() & ~(Move::Take | Move::Castle | Move::Check | Move::CheckMate | Move::EnPassant | Move::Promote) ); if ( m_grid->contains ( move->to() ) )