summaryrefslogtreecommitdiffstats
path: root/libksirtet/common/field.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libksirtet/common/field.cpp')
-rw-r--r--libksirtet/common/field.cpp243
1 files changed, 243 insertions, 0 deletions
diff --git a/libksirtet/common/field.cpp b/libksirtet/common/field.cpp
new file mode 100644
index 00000000..2d67062e
--- /dev/null
+++ b/libksirtet/common/field.cpp
@@ -0,0 +1,243 @@
+#include "field.h"
+#include "field.moc"
+
+#include <qwhatsthis.h>
+#include <qlabel.h>
+#include <qlayout.h>
+
+#include <klocale.h>
+#include <kprogress.h>
+#include <kgameprogress.h>
+#include <kcanvasrootpixmap.h>
+#include <kgamelcd.h>
+
+#include "base/baseprefs.h"
+#include "factory.h"
+#include "highscores.h"
+#include "misc_ui.h"
+#include "board.h"
+#include "commonprefs.h"
+
+
+Field::Field(QWidget *parent)
+: MPSimpleBoard(parent), BaseField(this)
+{
+// column 1
+ // score LCD
+ scoreList = new KGameLCDList(this);
+ showScore = new KGameLCD(6, scoreList);
+ scoreList->append(showScore);
+ showTime = new KGameLCDClock(scoreList);
+ scoreList->append(showTime);
+ lcds->addWidget(scoreList, 1, 0);
+ lcds->setRowStretch(2, 1);
+
+ // removed LCD
+ removedList = new KGameLCDList(i18n(bfactory->mainData.removedLabel), this);
+ lcds->addWidget(removedList, 3, 0);
+ lcds->setRowStretch(4, 1);
+
+ // level progress
+ levelLabel = new QLabel(this);
+ levelLabel->setAlignment(AlignCenter);
+ lcds->addWidget(levelLabel, 5, 0);
+ toLevel = new KProgress(this);
+ toLevel->setTextEnabled(true);
+ toLevel->setFormat("1");
+ QWhatsThis::add(toLevel, i18n("Display the progress to complete the current level or stage."));
+ lcds->addWidget(toLevel, 6, 0);
+ lcds->setRowStretch(7, 1);
+
+// column 2
+ // previous player height
+ prevHeight = new PlayerProgress(board, this, "prev_progress");
+ QWhatsThis::add(prevHeight, i18n("Previous player's height"));
+ top->addWidget(prevHeight, 1, 1, AlignHCenter);
+
+// column 3
+ // pending gift shower
+ Board *b = static_cast<Board *>(board);
+ top->addWidget(b->giftPool(), 0, 2, AlignCenter);
+
+ // shadow piece
+ shadow = new Shadow(board, this);
+ QWhatsThis::add(shadow, i18n("Shadow of the current piece"));
+ top->addWidget(shadow, 2, 2);
+
+// column 4
+ // next player height
+ nextHeight = new PlayerProgress(board, this, "next_progress");
+ QWhatsThis::add(nextHeight, i18n("Next player's height"));
+ top->addWidget(nextHeight, 1, 3, AlignHCenter);
+
+// column 5
+ // next piece shower
+ QVBoxLayout *vbl = new QVBoxLayout(10);
+ top->addLayout(vbl, 1, 4);
+ vbl->addStretch(1);
+
+ labShowNext = new QLabel(i18n("Next Tile"), this);
+ labShowNext->setAlignment(AlignCenter);
+ vbl->addWidget(labShowNext, 0);
+ showNext = new ShowNextPiece(board, this);
+ _snRootPixmap = new KCanvasRootPixmap(showNext);
+ _snRootPixmap->start();
+ vbl->addWidget(showNext, 0);
+ vbl->addStretch(4);
+
+ connect(board, SIGNAL(scoreUpdated()), SLOT(scoreUpdatedSlot()));
+ connect(board, SIGNAL(levelUpdated()), SLOT(levelUpdated()));
+ connect(board, SIGNAL(removedUpdated()), SLOT(removedUpdated()));
+
+ initVariableGUI();
+}
+
+void Field::levelUpdated()
+{
+ toLevel->setFormat(QString::number(board->level()));
+ // necessary to update string ...
+ int p = toLevel->progress();
+ toLevel->setProgress(p+1);
+ toLevel->setProgress(p);
+}
+
+void Field::removedUpdated()
+{
+ uint nb = cfactory->cbi.nbRemovedToLevel;
+ toLevel->setProgress(isArcade() ? board->arcadeDone()
+ : board->nbRemoved() % nb);
+}
+
+void Field::showOpponents(bool show)
+{
+ Board *b = static_cast<Board *>(board);
+ if (show) {
+ prevHeight->show();
+ nextHeight->show();
+ b->giftPool()->show();
+ } else {
+ prevHeight->hide();
+ nextHeight->hide();
+ b->giftPool()->hide();
+ }
+}
+
+void Field::settingsChanged()
+{
+ BaseField::settingsChanged();
+ QColor color = BasePrefs::fadeColor();
+ double s = BasePrefs::fadeIntensity();
+ _snRootPixmap->setFadeEffect(s, color);
+ showNext->canvas()->setBackgroundColor(color);
+ bool b = CommonPrefs::showNextPiece();
+ if (b) {
+ showNext->show();
+ labShowNext->show();
+ } else {
+ showNext->hide();
+ labShowNext->hide();
+ }
+ b = CommonPrefs::showPieceShadow();
+ if (b) shadow->show();
+ else shadow->hide();
+}
+
+void Field::_init(bool AI, bool multiplayer, bool server, bool first,
+ const QString &name)
+{
+ BaseField::init(AI, multiplayer, server, first, name);
+ showOpponents(multiplayer);
+ static_cast<Board *>(board)->setType(AI);
+}
+
+void Field::_initFlag(QDataStream &s)
+{
+ ServerInitData sid;
+ s >> sid;
+ GTInitData data;
+ data.seed = sid.seed;
+ data.initLevel = sid.initLevel;
+
+ shadow->setDisplay(true);
+ toLevel->setValue(0);
+ showTime->reset();
+ showTime->start();
+
+ BaseField::start(data);
+ initVariableGUI();
+}
+
+void Field::initVariableGUI()
+{
+ if ( board->isArcade() ) {
+ scoreList->title()->setText(i18n("Elapsed time"));
+ showScore->hide();
+ showTime->show();
+ QWhatsThis::add(scoreList, i18n("Display the elapsed time."));
+ levelLabel->setText(i18n("Stage"));
+ toLevel->setTotalSteps( board->arcadeTodo() );
+ } else {
+ scoreList->title()->setText(i18n("Score"));
+ showScore->show();
+ showTime->hide();
+ QWhatsThis::add(scoreList, i18n("<qt>Display the current score.<br/>It turns <font color=\"blue\">blue</font> if it is a highscore and <font color=\"red\">red</font> if it is the best local score.</qt>"));
+ levelLabel->setText(i18n("Level"));
+ toLevel->setTotalSteps(cfactory->cbi.nbRemovedToLevel);
+ }
+}
+
+void Field::_playFlag(QDataStream &s)
+{
+ ServerPlayData spd;
+ s >> spd;
+ prevHeight->setValue(spd.prevHeight);
+ nextHeight->setValue(spd.nextHeight);
+ if (spd.gift)
+ static_cast<Board *>(board)->giftPool()->put(spd.gift);
+}
+
+void Field::_pauseFlag(bool p)
+{
+ pause(p);
+ shadow->setDisplay(!p);
+ if (p) showTime->stop();
+ else showTime->start();
+}
+
+void Field::_stopFlag(bool gameover)
+{
+ BaseField::stop(gameover);
+ showTime->stop();
+}
+
+void Field::_dataOut(QDataStream &s)
+{
+ _cpd.height = board->firstClearLine();
+ _cpd.end = static_cast<Board *>(board)->isGameOver();
+ _cpd.gift = static_cast<Board *>(board)->gift();
+ s << _cpd;
+}
+
+KExtHighscore::Score Field::currentScore() const
+{
+ KExtHighscore::Score score(_cpd.end ? KExtHighscore::Lost : KExtHighscore::Won);
+ score.setScore(board->score());
+ score.setData("level", board->level());
+ score.setData("removed", board->nbRemoved());
+ return score;
+}
+
+void Field::_gameOverDataOut(QDataStream &s)
+{
+ s << currentScore();
+}
+
+void Field::moveLeft() { static_cast<Board *>(board)->pMoveLeft(); }
+void Field::moveRight() { static_cast<Board *>(board)->pMoveRight(); }
+void Field::dropDownStart() { static_cast<Board *>(board)->pDropDownStart(); }
+void Field::dropDownStop() { static_cast<Board *>(board)->pDropDownStop(); }
+void Field::oneLineDown() { static_cast<Board *>(board)->pOneLineDown(); }
+void Field::rotateLeft() { static_cast<Board *>(board)->pRotateLeft(); }
+void Field::rotateRight() { static_cast<Board *>(board)->pRotateRight(); }
+void Field::moveLeftTotal() { static_cast<Board *>(board)->pMoveLeftTotal(); }
+void Field::moveRightTotal() { static_cast<Board *>(board)->pMoveRightTotal();}