summaryrefslogtreecommitdiffstats
path: root/libksirtet/common/board.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libksirtet/common/board.cpp')
-rw-r--r--libksirtet/common/board.cpp286
1 files changed, 286 insertions, 0 deletions
diff --git a/libksirtet/common/board.cpp b/libksirtet/common/board.cpp
new file mode 100644
index 00000000..f5f011a6
--- /dev/null
+++ b/libksirtet/common/board.cpp
@@ -0,0 +1,286 @@
+#include "board.h"
+#include "board.moc"
+
+#include <knotifyclient.h>
+#include <klocale.h>
+
+#include "factory.h"
+#include "base/piece.h"
+#include "misc_ui.h"
+#include "ai.h"
+#include "commonprefs.h"
+
+
+Board::Board(bool graphic, GiftPool *gp, QWidget *parent)
+ : BaseBoard(graphic, parent),
+ _giftPool(gp), aiEngine(0)
+{}
+
+Board::~Board()
+{
+ delete aiEngine;
+}
+
+void Board::setType(bool _ai)
+{
+ Q_ASSERT( graphic() );
+ if (_ai) {
+ if ( aiEngine==0 ) aiEngine = cfactory->createAI();
+ } else {
+ delete aiEngine;
+ aiEngine = 0;
+ }
+}
+
+void Board::start(const GTInitData &data)
+{
+ randomGarbage.setSeed(data.seed);
+ _giftPool->reset();
+ BaseBoard::start(data);
+}
+
+void Board::stop()
+{
+ BaseBoard::stop();
+ if (aiEngine) aiEngine->stop();
+}
+
+void Board::showBoard(bool show)
+{
+ BaseBoard::showBoard(show);
+ showCanvas(_next, show);
+}
+
+void Board::unpause()
+{
+ BaseBoard::unpause();
+ if (aiEngine) aiEngine->start(); // eventually restart thinking
+}
+
+void Board::updateLevel()
+{
+ uint nb = cfactory->cbi.nbRemovedToLevel;
+ if ( nbRemoved()>=level()*nb ) updateLevel(level()+1);
+}
+
+void Board::updateLevel(uint newLevel)
+{
+ BaseBoard::updateLevel(newLevel);
+ emit levelUpdated();
+ if ( graphic() ) startTimer();
+}
+
+void Board::settingsChanged()
+{
+ BaseBoard::settingsChanged();
+ if (aiEngine) aiEngine->settingsChanged();
+}
+
+/*****************************************************************************/
+void Board::pMoveLeft()
+{
+ if ( state!=Normal ) return;
+ moveLeft();
+ main->update();
+}
+
+void Board::pMoveRight()
+{
+ if ( state!=Normal ) return;
+ moveRight();
+ main->update();
+}
+
+void Board::pMoveLeftTotal()
+{
+ if ( state!=Normal ) return;
+ moveLeft(bfactory->bbi.width);
+ main->update();
+}
+
+void Board::pMoveRightTotal()
+{
+ if ( state!=Normal ) return;
+ moveRight(bfactory->bbi.width);
+ main->update();
+}
+
+void Board::pOneLineDown()
+{
+ if ( state!=Normal ) return;
+ oneLineDown();
+ main->update();
+}
+
+void Board::pDropDownStart()
+{
+ if ( state!=Normal ) return;
+ _dropHeight = 0;
+ oneLineDown();
+ if ( state==Normal ) {
+ state = DropDown;
+ startTimer();
+ }
+ main->update();
+}
+
+void Board::pDropDownStop()
+{
+ if ( state!=DropDown || CommonPrefs::directDropDownEnabled() ) return;
+ state = Normal;
+ startTimer();
+ main->update();
+}
+
+void Board::pRotateLeft()
+{
+ if ( state!=Normal ) return;
+ rotateLeft();
+ main->update();
+}
+
+void Board::pRotateRight()
+{
+ if ( state!=Normal ) return;
+ rotateRight();
+ main->update();
+}
+
+void Board::pieceDropped(uint dropHeight)
+{
+ if ( state==DropDown ) state = Normal;
+ else _dropHeight = dropHeight;
+ _beforeGlue(true);
+}
+
+void Board::_beforeGlue(bool first)
+{
+ if ( graphic() ) {
+ state = (beforeGlue(_dropHeight>=1, first) ? BeforeGlue : Normal);
+ if ( state==BeforeGlue ) {
+ startTimer();
+ return;
+ }
+ }
+ gluePiece();
+}
+
+void Board::gluePiece()
+{
+ BaseBoard::gluePiece();
+ _afterGlue(true);
+ if ( graphic() ) KNotifyClient::event(winId(), "glued", i18n("Piece glued"));
+}
+
+void Board::_afterGlue(bool first)
+{
+ bool b = afterGlue(!graphic(), first);
+ if ( graphic() ) {
+ state = (b ? AfterGlue : Normal);
+ if ( state==AfterGlue ) {
+ startTimer();
+ return;
+ }
+ }
+
+ updateScore(score() + _dropHeight);
+ if ( needRemoving() ) _beforeRemove(true);
+ else _afterAfterRemove();
+}
+
+bool Board::afterAfterRemove()
+{
+ // checkGift
+ if ( graphic() && _giftPool->pending() ) {
+ if ( putGift(_giftPool->take()) ) {
+ computeInfos();
+ _afterGift(true);
+ return true;
+ } else return false;
+ }
+ return newPiece();
+}
+
+void Board::_afterGift(bool first)
+{
+ Q_ASSERT( graphic() );
+ state = (afterGift(first) ? AfterGift : Normal);
+ if ( state==AfterGift ) startTimer();
+ else afterAfterRemove();
+}
+
+bool Board::newPiece()
+{
+ Q_ASSERT( !graphic() || state==Normal );
+ if ( !BaseBoard::newPiece() ) return false;
+ if ( graphic() ) {
+ main->update();
+ _next->update();
+ if (aiEngine) aiEngine->launch(this);
+ // else : a human player can think by himself ...
+ }
+ return true;
+}
+
+bool Board::timeout()
+{
+ if ( BaseBoard::timeout() ) return true;
+
+ switch (state) {
+ case DropDown: _dropHeight++;
+ case Normal: oneLineDown(); break;
+ case BeforeGlue: _beforeGlue(false); break;
+ case AfterGlue: _afterGlue(false); break;
+ case AfterGift: _afterGift(false); break;
+ default: return false;
+ }
+ main->update();
+ return true;
+}
+
+uint Board::normalTime() const
+{
+ return cfactory->cbi.baseTime / (1 + level());
+}
+
+bool Board::startTimer()
+{
+ if ( BaseBoard::startTimer() ) return true;
+
+ switch (state) {
+ case Normal:
+ timer.start(normalTime());
+ break;
+ case DropDown:
+ timer.start(cfactory->cbi.dropDownTime);
+ break;
+ case BeforeGlue:
+ timer.start(cfactory->cbi.beforeGlueTime, true);
+ break;
+ case AfterGlue:
+ timer.start(cfactory->cbi.afterGlueTime, true);
+ break;
+ case AfterGift:
+ timer.start(cfactory->cbi.afterGiftTime, true);
+ break;
+ default:
+ return false;
+ }
+ return true;
+}
+
+
+//-----------------------------------------------------------------------------
+bool Board::beforeGlue(bool bump, bool first)
+{
+ if ( !bump ) return false;
+ if (first) {
+ loop = 0;
+ return true;
+ } else loop++;
+
+ float dec = BasePrefs::blockSize() * (loop+1) * -0.1;
+ if ( BasePrefs::animationsEnabled() ) bumpCurrentPiece((int)dec);
+
+ return ( loop!=cfactory->cbi.nbBumpStages );
+}